Message ID | 20210113154540.24981-2-lulu@redhat.com |
---|---|
State | New |
Headers | show |
Series | vhost-vdpa: add support for configure interrupt | expand |
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 <lulu@redhat.com> > --- > 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,
On Thu, Jan 14, 2021 at 12:34 PM Jason Wang <jasowang@redhat.com> 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 <lulu@redhat.com> > > --- > > 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, >
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,
Add configure notifier and virtio_set_config_notifier_fd_handler in virtio Signed-off-by: Cindy Lu <lulu@redhat.com> --- hw/virtio/virtio.c | 25 +++++++++++++++++++++++++ include/hw/virtio/virtio.h | 5 +++++ 2 files changed, 30 insertions(+)