[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/13] virtio: inline virtio_queue_set_host_notifier
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 12/13] virtio: inline virtio_queue_set_host_notifier_fd_handler |
Date: |
Fri, 21 Oct 2016 22:48:15 +0200 |
Of the three possible parameter combinations for
virtio_queue_set_host_notifier_fd_handler:
- assign=true/set_handler=true is only called from
virtio_device_start_ioeventfd
- assign=false/set_handler=false is called from
set_host_notifier_internal but it only does something when
reached from virtio_device_stop_ioeventfd_impl; otherwise
there is no EventNotifier set on qemu_get_aio_context().
- assign=true/set_handler=false is called from
set_host_notifier_internal, but it is not doing anything:
with the new start_ioeventfd and stop_ioeventfd methods,
there is never an EventNotifier set on qemu_get_aio_context()
at this point. This is enforced by the assertion in
virtio_bus_set_host_notifier.
Reviewed-by: Cornelia Huck <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
v2->v3: fix "before after" in comment [Cornelia]
hw/virtio/virtio-bus.c | 19 +++++++++++--------
hw/virtio/virtio.c | 27 +++++++++------------------
include/hw/virtio/virtio.h | 3 +--
3 files changed, 21 insertions(+), 28 deletions(-)
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
index fd105b8..670746c 100644
--- a/hw/virtio/virtio-bus.c
+++ b/hw/virtio/virtio-bus.c
@@ -163,19 +163,22 @@ static int set_host_notifier_internal(DeviceState *proxy,
VirtioBusState *bus,
__func__, strerror(-r), r);
return r;
}
- virtio_queue_set_host_notifier_fd_handler(vq, true, false);
- r = k->ioeventfd_assign(proxy, notifier, n, assign);
+ r = k->ioeventfd_assign(proxy, notifier, n, true);
if (r < 0) {
error_report("%s: unable to assign ioeventfd: %d", __func__, r);
- virtio_queue_set_host_notifier_fd_handler(vq, false, false);
- event_notifier_cleanup(notifier);
- return r;
+ goto cleanup_event_notifier;
}
+ return 0;
} else {
- k->ioeventfd_assign(proxy, notifier, n, assign);
- virtio_queue_set_host_notifier_fd_handler(vq, false, false);
- event_notifier_cleanup(notifier);
+ k->ioeventfd_assign(proxy, notifier, n, false);
}
+
+cleanup_event_notifier:
+ /* Test and clear notifier after disabling event,
+ * in case poll callback didn't have time to run.
+ */
+ virtio_queue_host_notifier_read(notifier);
+ event_notifier_cleanup(notifier);
return r;
}
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 8b74600..5e5d09a 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2031,7 +2031,7 @@ void virtio_queue_aio_set_host_notifier_handler(VirtQueue
*vq, AioContext *ctx,
}
}
-static void virtio_queue_host_notifier_read(EventNotifier *n)
+void virtio_queue_host_notifier_read(EventNotifier *n)
{
VirtQueue *vq = container_of(n, VirtQueue, host_notifier);
if (event_notifier_test_and_clear(n)) {
@@ -2039,22 +2039,6 @@ static void
virtio_queue_host_notifier_read(EventNotifier *n)
}
}
-void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
- bool set_handler)
-{
- if (assign && set_handler) {
- event_notifier_set_handler(&vq->host_notifier, true,
- virtio_queue_host_notifier_read);
- } else {
- event_notifier_set_handler(&vq->host_notifier, true, NULL);
- }
- if (!assign) {
- /* Test and clear notifier before after disabling event,
- * in case poll callback didn't have time to run. */
- virtio_queue_host_notifier_read(&vq->host_notifier);
- }
-}
-
EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq)
{
return &vq->host_notifier;
@@ -2134,6 +2118,7 @@ static int
virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)
int n, r, err;
for (n = 0; n < VIRTIO_QUEUE_MAX; n++) {
+ VirtQueue *vq = &vdev->vq[n];
if (!virtio_queue_get_num(vdev, n)) {
continue;
}
@@ -2142,7 +2127,8 @@ static int
virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)
err = r;
goto assign_error;
}
- virtio_queue_set_host_notifier_fd_handler(&vdev->vq[n], true, true);
+ event_notifier_set_handler(&vq->host_notifier, true,
+ virtio_queue_host_notifier_read);
}
for (n = 0; n < VIRTIO_QUEUE_MAX; n++) {
@@ -2157,10 +2143,12 @@ static int
virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)
assign_error:
while (--n >= 0) {
+ VirtQueue *vq = &vdev->vq[n];
if (!virtio_queue_get_num(vdev, n)) {
continue;
}
+ event_notifier_set_handler(&vq->host_notifier, true, NULL);
r = virtio_bus_set_host_notifier(qbus, n, false);
assert(r >= 0);
}
@@ -2181,9 +2169,12 @@ static void
virtio_device_stop_ioeventfd_impl(VirtIODevice *vdev)
int n, r;
for (n = 0; n < VIRTIO_QUEUE_MAX; n++) {
+ VirtQueue *vq = &vdev->vq[n];
+
if (!virtio_queue_get_num(vdev, n)) {
continue;
}
+ event_notifier_set_handler(&vq->host_notifier, true, NULL);
r = virtio_bus_set_host_notifier(qbus, n, false);
assert(r >= 0);
}
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index 0e14c2c..f9d9407 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -268,8 +268,7 @@ int virtio_device_start_ioeventfd(VirtIODevice *vdev);
void virtio_device_stop_ioeventfd(VirtIODevice *vdev);
bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev);
EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq);
-void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
- bool set_handler);
+void virtio_queue_host_notifier_read(EventNotifier *n);
void virtio_queue_aio_set_host_notifier_handler(VirtQueue *vq, AioContext *ctx,
void (*fn)(VirtIODevice *,
VirtQueue *));
--
1.8.3.1
- [Qemu-devel] [PATCH 05/13] virtio: introduce virtio_device_ioeventfd_enabled, (continued)
- [Qemu-devel] [PATCH 05/13] virtio: introduce virtio_device_ioeventfd_enabled, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 04/13] virtio: add start_ioeventfd and stop_ioeventfd to VirtioDeviceClass, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 08/13] Revert "virtio: Introduce virtio_add_queue_aio", Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 06/13] virtio-blk: always use dataplane path if ioeventfd is active, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 07/13] virtio-scsi: always use dataplane path if ioeventfd is active, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 09/13] virtio: remove set_handler argument from set_host_notifier_internal, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 11/13] virtio: use virtio_bus_set_host_notifier to start/stop ioeventfd, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 10/13] virtio: remove ioeventfd_disabled altogether, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 13/13] virtio: inline set_host_notifier_internal, Paolo Bonzini, 2016/10/21
- [Qemu-devel] [PATCH 12/13] virtio: inline virtio_queue_set_host_notifier_fd_handler,
Paolo Bonzini <=
- [Qemu-devel] [14/13] fixup! virtio: remove set_handler argument from set_host_notifier_internal, Paolo Bonzini, 2016/10/24