qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v1 1/4] virtio:add support in configure interrupt


From: Jason Wang
Subject: Re: [PATCH v1 1/4] virtio:add support in configure interrupt
Date: Thu, 14 Jan 2021 12:33:56 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0


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,




reply via email to

[Prev in Thread] Current Thread [Next in Thread]