[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 40/42] dataplane: Fix startup race.
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 40/42] dataplane: Fix startup race. |
Date: |
Fri, 6 Sep 2013 17:39:11 +0200 |
From: Cornelia Huck <address@hidden>
Avoid trying to setup dataplane again if dataplane setup is already in
progress. This may happen if an eventfd is triggered during setup.
I saw this occasionally with an experimental s390 irqfd implementation:
virtio_blk_handle_output
-> virtio_blk_data_plane_start
-> virtio_ccw_set_host_notifier
...
-> virtio_queue_set_host_notifier_fd_handler
-> virtio_queue_host_notifier_read
-> virtio_queue_notify_vq
-> virtio_blk_handle_output
-> virtio_blk_data_plane_start
-> vring_setup
-> hostmem_init
-> memory_listener_register
-> BOOM
As virtio-ccw tries to follow what virtio-pci does, it might be triggerable
for other platforms as well.
Signed-off-by: Cornelia Huck <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/block/dataplane/virtio-blk.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
index 5a96ccd..f2d7350 100644
--- a/hw/block/dataplane/virtio-blk.c
+++ b/hw/block/dataplane/virtio-blk.c
@@ -42,6 +42,7 @@ typedef struct {
struct VirtIOBlockDataPlane {
bool started;
+ bool starting;
bool stopping;
QEMUBH *start_bh;
QemuThread thread;
@@ -451,8 +452,15 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
return;
}
+ if (s->starting) {
+ return;
+ }
+
+ s->starting = true;
+
vq = virtio_get_queue(s->vdev, 0);
if (!vring_setup(&s->vring, s->vdev, 0)) {
+ s->starting = false;
return;
}
@@ -482,6 +490,7 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s)
s->io_notifier = *ioq_get_notifier(&s->ioqueue);
aio_set_event_notifier(s->ctx, &s->io_notifier, handle_io);
+ s->starting = false;
s->started = true;
trace_virtio_blk_data_plane_start(s);
--
1.8.3.1
- [Qemu-devel] [PULL 36/42] raw-posix: return get_block_status data and flags, (continued)
- [Qemu-devel] [PULL 36/42] raw-posix: return get_block_status data and flags, Stefan Hajnoczi, 2013/09/06
- [Qemu-devel] [PULL 37/42] raw-posix: report unwritten extents as zero, Stefan Hajnoczi, 2013/09/06
- [Qemu-devel] [PULL 38/42] block: add default get_block_status implementation for protocols, Stefan Hajnoczi, 2013/09/06
- [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Stefan Hajnoczi, 2013/09/06
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Peter Lieven, 2013/09/13
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Peter Lieven, 2013/09/13
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Paolo Bonzini, 2013/09/13
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Peter Lieven, 2013/09/13
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Paolo Bonzini, 2013/09/13
- Re: [Qemu-devel] [PULL 39/42] block: look for zero blocks in bs->file, Peter Lieven, 2013/09/13
[Qemu-devel] [PULL 40/42] dataplane: Fix startup race.,
Stefan Hajnoczi <=
[Qemu-devel] [PULL 41/42] qemu-iotests: Whitespace cleanup, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 42/42] qemu-iotests: Fixed test case 026, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 18/42] qmp: Documentation for BLOCK_IMAGE_CORRUPTED, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 20/42] cow: make writes go at a less indecent speed, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 16/42] nbd: use BlockDriverState refcnt, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 25/42] block: remove bdrv_is_allocated_above/bdrv_co_is_allocated_above distinction, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 26/42] block: expect errors from bdrv_co_is_allocated, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 22/42] block: keep bs->total_sectors up to date even for growable block devices, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 23/42] block: make bdrv_co_is_allocated static, Stefan Hajnoczi, 2013/09/06
[Qemu-devel] [PULL 21/42] cow: do not call bdrv_co_is_allocated, Stefan Hajnoczi, 2013/09/06