mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
virtio_config: introduce a new .enable_cbs method
This patch introduces a new method to enable the callbacks for config and virtqueues. This will be used for making sure the virtqueue callbacks are only enabled after virtio_device_ready() if transport implements this method. Signed-off-by: Jason Wang <jasowang@redhat.com> Link: https://lore.kernel.org/r/20211019070152.8236-4-jasowang@redhat.com Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
28962ec595
commit
d50497eb4e
@ -23,6 +23,8 @@ struct virtio_shm_region {
|
|||||||
* any of @get/@set, @get_status/@set_status, or @get_features/
|
* any of @get/@set, @get_status/@set_status, or @get_features/
|
||||||
* @finalize_features are NOT safe to be called from an atomic
|
* @finalize_features are NOT safe to be called from an atomic
|
||||||
* context.
|
* context.
|
||||||
|
* @enable_cbs: enable the callbacks
|
||||||
|
* vdev: the virtio_device
|
||||||
* @get: read the value of a configuration field
|
* @get: read the value of a configuration field
|
||||||
* vdev: the virtio_device
|
* vdev: the virtio_device
|
||||||
* offset: the offset of the configuration field
|
* offset: the offset of the configuration field
|
||||||
@ -75,6 +77,7 @@ struct virtio_shm_region {
|
|||||||
*/
|
*/
|
||||||
typedef void vq_callback_t(struct virtqueue *);
|
typedef void vq_callback_t(struct virtqueue *);
|
||||||
struct virtio_config_ops {
|
struct virtio_config_ops {
|
||||||
|
void (*enable_cbs)(struct virtio_device *vdev);
|
||||||
void (*get)(struct virtio_device *vdev, unsigned offset,
|
void (*get)(struct virtio_device *vdev, unsigned offset,
|
||||||
void *buf, unsigned len);
|
void *buf, unsigned len);
|
||||||
void (*set)(struct virtio_device *vdev, unsigned offset,
|
void (*set)(struct virtio_device *vdev, unsigned offset,
|
||||||
@ -229,6 +232,9 @@ void virtio_device_ready(struct virtio_device *dev)
|
|||||||
{
|
{
|
||||||
unsigned status = dev->config->get_status(dev);
|
unsigned status = dev->config->get_status(dev);
|
||||||
|
|
||||||
|
if (dev->config->enable_cbs)
|
||||||
|
dev->config->enable_cbs(dev);
|
||||||
|
|
||||||
BUG_ON(status & VIRTIO_CONFIG_S_DRIVER_OK);
|
BUG_ON(status & VIRTIO_CONFIG_S_DRIVER_OK);
|
||||||
dev->config->set_status(dev, status | VIRTIO_CONFIG_S_DRIVER_OK);
|
dev->config->set_status(dev, status | VIRTIO_CONFIG_S_DRIVER_OK);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user