Re: [PATCH v1 1/4] virtio:add support in configure interrupt
On Thu, Jan 14, 2021 at 12:34 PM Jason Wang wrote: > > > On 2021/1/13 下午11:45, Cindy Lu wrote: > > Add configure notifier and virtio_set_config_notifier_fd_handler > > in virtio > > > > Signed-off-by: Cindy Lu > > --- > > hw/virtio/virtio.c | 25 + > > include/hw/virtio/virtio.h | 5 + > > 2 files changed, 30 insertions(+) > > > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > > index ceb58fda6c..66ed1daf95 100644 > > --- a/hw/virtio/virtio.c > > +++ b/hw/virtio/virtio.c > > @@ -3502,6 +3502,15 @@ static void > > virtio_queue_guest_notifier_read(EventNotifier *n) > > } > > } > > > > +static void virtio_queue_config_read(EventNotifier *n) > > +{ > > > Note that the config interrupt belongs to the device. So it's better not > name it as "queue" here. > sure I will fix this > > > +VirtIODevice *vdev = container_of(n, VirtIODevice, config_notifier); > > + > > +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 +3527,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_queue_config_read); > > +} else { > > + event_notifier_set_handler(&vdev->config_notifier, NULL); > > +} > > +} > > > I wonder whether we can simply generalize > virtio_queue_set_guest_notifier_fd_handler from > > void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, > bool with_irqfd) > > to > > void virtio_set_guest_notifier_fd_handler(EventNotifier *e, bool assign, > bool with_irqfd) > > > Since there's actually no virtqueue specific setup in this function, > what its callee really want is a simple EventNotifier. > > Thanks > Thanks Jason, I will fix ths > > > + > > EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq) > > { > > return &vq->guest_notifier; > > @@ -3591,6 +3611,11 @@ EventNotifier > > *virtio_queue_get_host_notifier(VirtQueue *vq) > > return &vq->host_notifier; > > } > > > > +EventNotifier *virtio_queue_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.h b/include/hw/virtio/virtio.h > > index b7ece7a6a8..38bd28242e 100644 > > --- a/include/hw/virtio/virtio.h > > +++ b/include/hw/virtio/virtio.h > > @@ -108,6 +108,7 @@ struct VirtIODevice > > bool use_guest_notifier_mask; > > AddressSpace *dma_as; > > QLIST_HEAD(, VirtQueue) *vector_queues; > > +EventNotifier config_notifier; > > }; > > > > struct VirtioDeviceClass { > > @@ -310,11 +311,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_queue_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, >
Re: [PATCH v1 1/4] virtio:add support in configure interrupt
On 2021/1/13 下午11:45, Cindy Lu wrote: Add configure notifier and virtio_set_config_notifier_fd_handler in virtio Signed-off-by: Cindy Lu --- hw/virtio/virtio.c | 25 + include/hw/virtio/virtio.h | 5 + 2 files changed, 30 insertions(+) diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index ceb58fda6c..66ed1daf95 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3502,6 +3502,15 @@ static void virtio_queue_guest_notifier_read(EventNotifier *n) } } +static void virtio_queue_config_read(EventNotifier *n) +{ Note that the config interrupt belongs to the device. So it's better not name it as "queue" here. +VirtIODevice *vdev = container_of(n, VirtIODevice, config_notifier); + +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 +3527,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_queue_config_read); +} else { + event_notifier_set_handler(&vdev->config_notifier, NULL); +} +} I wonder whether we can simply generalize virtio_queue_set_guest_notifier_fd_handler from void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign, bool with_irqfd) to void virtio_set_guest_notifier_fd_handler(EventNotifier *e, bool assign, bool with_irqfd) Since there's actually no virtqueue specific setup in this function, what its callee really want is a simple EventNotifier. Thanks + EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq) { return &vq->guest_notifier; @@ -3591,6 +3611,11 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq) return &vq->host_notifier; } +EventNotifier *virtio_queue_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.h b/include/hw/virtio/virtio.h index b7ece7a6a8..38bd28242e 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -108,6 +108,7 @@ struct VirtIODevice bool use_guest_notifier_mask; AddressSpace *dma_as; QLIST_HEAD(, VirtQueue) *vector_queues; +EventNotifier config_notifier; }; struct VirtioDeviceClass { @@ -310,11 +311,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_queue_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,
[PATCH v1 1/4] virtio:add support in configure interrupt
Add configure notifier and virtio_set_config_notifier_fd_handler in virtio Signed-off-by: Cindy Lu --- hw/virtio/virtio.c | 25 + include/hw/virtio/virtio.h | 5 + 2 files changed, 30 insertions(+) diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index ceb58fda6c..66ed1daf95 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3502,6 +3502,15 @@ static void virtio_queue_guest_notifier_read(EventNotifier *n) } } +static void virtio_queue_config_read(EventNotifier *n) +{ +VirtIODevice *vdev = container_of(n, VirtIODevice, config_notifier); + +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 +3527,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_queue_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 +3611,11 @@ EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq) return &vq->host_notifier; } +EventNotifier *virtio_queue_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.h b/include/hw/virtio/virtio.h index b7ece7a6a8..38bd28242e 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -108,6 +108,7 @@ struct VirtIODevice bool use_guest_notifier_mask; AddressSpace *dma_as; QLIST_HEAD(, VirtQueue) *vector_queues; +EventNotifier config_notifier; }; struct VirtioDeviceClass { @@ -310,11 +311,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_queue_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, -- 2.21.3