[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 14/47] virtio: inline virtio_queue_set_host_notifier_
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 14/47] virtio: inline virtio_queue_set_host_notifier_fd_handler |
Date: |
Sun, 30 Oct 2016 23:23:59 +0200 |
From: Paolo Bonzini <address@hidden>
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>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
include/hw/virtio/virtio.h | 3 +--
hw/virtio/virtio-bus.c | 19 +++++++++++--------
hw/virtio/virtio.c | 27 +++++++++------------------
3 files changed, 21 insertions(+), 28 deletions(-)
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index 2fcd23c..ac65d6a 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -272,8 +272,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 *));
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 b738163..bcbcfe0 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -2042,7 +2042,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)) {
@@ -2050,22 +2050,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;
@@ -2148,6 +2132,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;
}
@@ -2156,7 +2141,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++) {
@@ -2171,10 +2157,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);
}
@@ -2195,9 +2183,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);
}
--
MST
- [Qemu-devel] [PULL 04/47] virtio: move ioeventfd_disabled flag to VirtioBusState, (continued)
- [Qemu-devel] [PULL 04/47] virtio: move ioeventfd_disabled flag to VirtioBusState, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 05/47] virtio: move ioeventfd_started flag to VirtioBusState, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 06/47] virtio: add start_ioeventfd and stop_ioeventfd to VirtioDeviceClass, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 07/47] virtio: introduce virtio_device_ioeventfd_enabled, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 09/47] virtio-scsi: always use dataplane path if ioeventfd is active, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 08/47] virtio-blk: always use dataplane path if ioeventfd is active, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 10/47] Revert "virtio: Introduce virtio_add_queue_aio", Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 11/47] virtio: remove set_handler argument from set_host_notifier_internal, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 12/47] virtio: remove ioeventfd_disabled altogether, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 13/47] virtio: use virtio_bus_set_host_notifier to start/stop ioeventfd, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 14/47] virtio: inline virtio_queue_set_host_notifier_fd_handler,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 15/47] virtio: inline set_host_notifier_internal, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 16/47] cryptodev: introduce cryptodev backend interface, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 17/47] cryptodev: add symmetric algorithm operation stuff, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 18/47] virtio-crypto: introduce virtio_crypto.h, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 19/47] cryptodev: introduce a new cryptodev backend, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 20/47] virtio-crypto: add virtio crypto device emulation, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 21/47] virtio-crypto-pci: add virtio crypto pci support, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 22/47] virtio-crypto: set capacity of algorithms supported, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 23/47] virtio-crypto: add control queue handler, Michael S. Tsirkin, 2016/10/30
- [Qemu-devel] [PULL 24/47] virtio-crypto: add data queue processing handler, Michael S. Tsirkin, 2016/10/30