qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] virtio: revert host notifiers to old semantics


From: Jason Wang
Subject: Re: [Qemu-devel] [PATCH] virtio: revert host notifiers to old semantics
Date: Mon, 4 Jul 2016 14:59:13 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0



On 2016年06月30日 23:31, Cornelia Huck wrote:
The host notifier rework tried both to unify host notifiers across
transports and plug a possible hole during host notifier
re-assignment. Unfortunately, this meant a change in semantics that
breaks vhost and iSCSI+dataplane.

As the minimal fix, keep the common host notifier code but revert
to the old semantics so that we have time to figure out the proper
fix.

Fixes: 6798e245a3 ("virtio-bus: common ioeventfd infrastructure")
Reported-by: Peter Lieven <address@hidden>
Reported-by: Jason Wang <address@hidden>
Reported-by: Marc-André Lureau <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
  hw/virtio/virtio-bus.c | 26 ++++++++++----------------
  1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
index 1313760..a85b7c8 100644
--- a/hw/virtio/virtio-bus.c
+++ b/hw/virtio/virtio-bus.c
@@ -176,8 +176,8 @@ static int set_host_notifier_internal(DeviceState *proxy, 
VirtioBusState *bus,
              return r;
          }
      } else {
-        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
          k->ioeventfd_assign(proxy, notifier, n, assign);
+        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
          event_notifier_cleanup(notifier);
      }
      return r;
@@ -251,31 +251,25 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int 
n, bool assign)
  {
      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
      DeviceState *proxy = DEVICE(BUS(bus)->parent);
-    VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtQueue *vq = virtio_get_queue(vdev, n);
if (!k->ioeventfd_started) {
          return -ENOSYS;
      }
+    k->ioeventfd_set_disabled(proxy, assign);
      if (assign) {
          /*
           * Stop using the generic ioeventfd, we are doing eventfd handling
           * ourselves below
+         *
+         * FIXME: We should just switch the handler and not deassign the
+         * ioeventfd.
+         * Otherwise, there's a window where we don't have an
+         * ioeventfd and we may end up with a notification where
+         * we don't expect one.
           */
-        k->ioeventfd_set_disabled(proxy, true);
-    }
-    /*
-     * Just switch the handler, don't deassign the ioeventfd.
-     * Otherwise, there's a window where we don't have an
-     * ioeventfd and we may end up with a notification where
-     * we don't expect one.
-     */
-    virtio_queue_set_host_notifier_fd_handler(vq, assign, !assign);
-    if (!assign) {
-        /* Use generic ioeventfd handler again. */
-        k->ioeventfd_set_disabled(proxy, false);
+        virtio_bus_stop_ioeventfd(bus);
      }
-    return 0;
+    return set_host_notifier_internal(proxy, bus, n, assign, false);
  }
static char *virtio_bus_get_dev_path(DeviceState *dev)

Reviewed-by: Jason Wang <address@hidden>
Tested-by: Jason Wang <address@hidden>



reply via email to

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