[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 2/4] virtio: always use handle_aio_output if register
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 2/4] virtio: always use handle_aio_output if registered |
Date: |
Wed, 22 Mar 2017 18:01:37 +0200 |
From: Paolo Bonzini <address@hidden>
Commit ad07cd6 ("virtio-scsi: always use dataplane path if ioeventfd is
active", 2016-10-30) and 9ffe337 ("virtio-blk: always use dataplane
path if ioeventfd is active", 2016-10-30) broke the virtio 1.0
indirect access registers.
The indirect access registers bypass the ioeventfd, so that virtio-blk
and virtio-scsi now repeatedly try to initialize dataplane instead of
triggering the guest->host EventNotifier. Detect the situation by
checking vq->handle_aio_output; if it is not NULL, trigger the
EventNotifier, which is how the device expects to get notifications
and in fact the only thread-safe manner to deliver them.
Fixes: ad07cd6
Fixes: 9ffe337
Cc: address@hidden
Signed-off-by: Paolo Bonzini <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
---
hw/virtio/virtio.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 82b6060..03592c5 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1528,7 +1528,18 @@ static void virtio_queue_notify_vq(VirtQueue *vq)
void virtio_queue_notify(VirtIODevice *vdev, int n)
{
- virtio_queue_notify_vq(&vdev->vq[n]);
+ VirtQueue *vq = &vdev->vq[n];
+
+ if (unlikely(!vq->vring.desc || vdev->broken)) {
+ return;
+ }
+
+ trace_virtio_queue_notify(vdev, vq - vdev->vq, vq);
+ if (vq->handle_aio_output) {
+ event_notifier_set(&vq->host_notifier);
+ } else if (vq->handle_output) {
+ vq->handle_output(vdev, vq);
+ }
}
uint16_t virtio_queue_vector(VirtIODevice *vdev, int n)
--
MST
- [Qemu-devel] [PULL 0/4] virtio, pc: fixes, Michael S. Tsirkin, 2017/03/22
- [Qemu-devel] [PULL 3/4] hw/acpi/vmgenid: prevent device realization on pre-2.5 machine types, Michael S. Tsirkin, 2017/03/22
- [Qemu-devel] [PULL 1/4] virtio: Fix error handling in virtio_bus_device_plugged, Michael S. Tsirkin, 2017/03/22
- [Qemu-devel] [PULL 2/4] virtio: always use handle_aio_output if registered,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 4/4] hw/acpi/vmgenid: prevent more than one vmgenid device, Michael S. Tsirkin, 2017/03/22
- Re: [Qemu-devel] [PULL 0/4] virtio, pc: fixes, Michael S. Tsirkin, 2017/03/22
- Re: [Qemu-devel] [PULL 0/4] virtio, pc: fixes, Peter Maydell, 2017/03/23