Message ID | 20210126074254.3225-2-lulu@redhat.com |
---|---|
State | New |
Headers | show |
Series | vhost-vdpa: add support for configure interrupt | expand |
On 2021/1/26 下午3:42, Cindy Lu wrote: > Add configure notifier and virtio_set_config_notifier_fd_handler > in virtio The title and commit log is kind of misleading. I think we should use "virtio: add guest notifier for config interrupt" > > Signed-off-by: Cindy Lu <lulu@redhat.com> > --- > hw/virtio/virtio.c | 26 ++++++++++++++++++++++++++ > include/hw/virtio/virtio-bus.h | 2 ++ > include/hw/virtio/virtio.h | 6 ++++++ > 3 files changed, 34 insertions(+) > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index ceb58fda6c..25e164cf8a 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -3502,6 +3502,16 @@ static void virtio_queue_guest_notifier_read(EventNotifier *n) > } > } > > +static void virtio_config_read(EventNotifier *n) > +{ > + VirtIODevice *vdev = container_of(n, VirtIODevice, config_notifier); > + if (!vdev->use_config_notifier) { > + return; > + } > + if (event_notifier_test_and_clear(n)) { > + virtio_notify_config(vdev); > + } > +} > void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, > bool with_irqfd) > { > @@ -3518,6 +3528,17 @@ void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, > } > } > > +void virtio_set_config_notifier_fd_handler(VirtIODevice *vdev, bool assign, > + bool with_irqfd) > +{ > + if (assign && !with_irqfd) { > + event_notifier_set_handler(&vdev->config_notifier, > + virtio_config_read); > + } else { > + event_notifier_set_handler(&vdev->config_notifier, NULL); > + } > +} > + > EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq) > { > return &vq->guest_notifier; > @@ -3591,6 +3612,11 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq) > return &vq->host_notifier; > } > > +EventNotifier *virtio_get_config_notifier(VirtIODevice *vdev) > +{ > + return &vdev->config_notifier; > + > +} > void virtio_queue_set_host_notifier_enabled(VirtQueue *vq, bool enabled) > { > vq->host_notifier_enabled = enabled; > diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h > index ef8abe49c5..97e13ec484 100644 > --- a/include/hw/virtio/virtio-bus.h > +++ b/include/hw/virtio/virtio-bus.h > @@ -93,6 +93,8 @@ struct VirtioBusClass { > */ > bool has_variable_vring_alignment; > AddressSpace *(*get_dma_as)(DeviceState *d); > + int (*set_config_notifiers)(DeviceState *d, bool assign); > + > }; > > struct VirtioBusState { > diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h > index b7ece7a6a8..79f2f78625 100644 > --- a/include/hw/virtio/virtio.h > +++ b/include/hw/virtio/virtio.h > @@ -108,6 +108,8 @@ struct VirtIODevice > bool use_guest_notifier_mask; > AddressSpace *dma_as; > QLIST_HEAD(, VirtQueue) *vector_queues; > + EventNotifier config_notifier; > + bool use_config_notifier; Let's document those two fields. Thanks > }; > > struct VirtioDeviceClass { > @@ -310,11 +312,15 @@ uint16_t virtio_get_queue_index(VirtQueue *vq); > EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq); > void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, > bool with_irqfd); > +void virtio_set_config_notifier_fd_handler(VirtIODevice *vdev, bool assign, > + bool with_irqfd); > + > int virtio_device_start_ioeventfd(VirtIODevice *vdev); > int virtio_device_grab_ioeventfd(VirtIODevice *vdev); > void virtio_device_release_ioeventfd(VirtIODevice *vdev); > bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev); > EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq); > +EventNotifier *virtio_get_config_notifier(VirtIODevice *vdev); > void virtio_queue_set_host_notifier_enabled(VirtQueue *vq, bool enabled); > void virtio_queue_host_notifier_read(EventNotifier *n); > void virtio_queue_aio_set_host_notifier_handler(VirtQueue *vq, AioContext *ctx,
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index ceb58fda6c..25e164cf8a 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3502,6 +3502,16 @@ static void virtio_queue_guest_notifier_read(EventNotifier *n) } } +static void virtio_config_read(EventNotifier *n) +{ + VirtIODevice *vdev = container_of(n, VirtIODevice, config_notifier); + if (!vdev->use_config_notifier) { + return; + } + if (event_notifier_test_and_clear(n)) { + virtio_notify_config(vdev); + } +} void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, bool with_irqfd) { @@ -3518,6 +3528,17 @@ void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, } } +void virtio_set_config_notifier_fd_handler(VirtIODevice *vdev, bool assign, + bool with_irqfd) +{ + if (assign && !with_irqfd) { + event_notifier_set_handler(&vdev->config_notifier, + virtio_config_read); + } else { + event_notifier_set_handler(&vdev->config_notifier, NULL); + } +} + EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq) { return &vq->guest_notifier; @@ -3591,6 +3612,11 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq) return &vq->host_notifier; } +EventNotifier *virtio_get_config_notifier(VirtIODevice *vdev) +{ + return &vdev->config_notifier; + +} void virtio_queue_set_host_notifier_enabled(VirtQueue *vq, bool enabled) { vq->host_notifier_enabled = enabled; diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h index ef8abe49c5..97e13ec484 100644 --- a/include/hw/virtio/virtio-bus.h +++ b/include/hw/virtio/virtio-bus.h @@ -93,6 +93,8 @@ struct VirtioBusClass { */ bool has_variable_vring_alignment; AddressSpace *(*get_dma_as)(DeviceState *d); + int (*set_config_notifiers)(DeviceState *d, bool assign); + }; struct VirtioBusState { diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index b7ece7a6a8..79f2f78625 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -108,6 +108,8 @@ struct VirtIODevice bool use_guest_notifier_mask; AddressSpace *dma_as; QLIST_HEAD(, VirtQueue) *vector_queues; + EventNotifier config_notifier; + bool use_config_notifier; }; struct VirtioDeviceClass { @@ -310,11 +312,15 @@ uint16_t virtio_get_queue_index(VirtQueue *vq); EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq); void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, bool with_irqfd); +void virtio_set_config_notifier_fd_handler(VirtIODevice *vdev, bool assign, + bool with_irqfd); + int virtio_device_start_ioeventfd(VirtIODevice *vdev); int virtio_device_grab_ioeventfd(VirtIODevice *vdev); void virtio_device_release_ioeventfd(VirtIODevice *vdev); bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev); EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq); +EventNotifier *virtio_get_config_notifier(VirtIODevice *vdev); void virtio_queue_set_host_notifier_enabled(VirtQueue *vq, bool enabled); void virtio_queue_host_notifier_read(EventNotifier *n); void virtio_queue_aio_set_host_notifier_handler(VirtQueue *vq, AioContext *ctx,
Add configure notifier and virtio_set_config_notifier_fd_handler in virtio Signed-off-by: Cindy Lu <lulu@redhat.com> --- hw/virtio/virtio.c | 26 ++++++++++++++++++++++++++ include/hw/virtio/virtio-bus.h | 2 ++ include/hw/virtio/virtio.h | 6 ++++++ 3 files changed, 34 insertions(+)