]> Git Repo - qemu.git/commitdiff
iothread: detach all block devices before stopping them
authorPaolo Bonzini <[email protected]>
Thu, 27 Oct 2016 10:49:00 +0000 (12:49 +0200)
committerFam Zheng <[email protected]>
Fri, 28 Oct 2016 13:50:18 +0000 (21:50 +0800)
Soon bdrv_drain will not call aio_poll itself on iothreads.  If block
devices are left hanging off the iothread's AioContext, there will be no
one to do I/O for those poor devices.

Signed-off-by: Paolo Bonzini <[email protected]>
Reviewed-by: Fam Zheng <[email protected]>
Message-Id: <1477565348[email protected]>
Signed-off-by: Fam Zheng <[email protected]>
iothread.c

index 62c87966198067879304f7f05b48ccfc71e6ef13..fdfb440fc43d7af46fc61230652d260ced5cd165 100644 (file)
@@ -16,6 +16,7 @@
 #include "qom/object_interfaces.h"
 #include "qemu/module.h"
 #include "block/aio.h"
+#include "block/block.h"
 #include "sysemu/iothread.h"
 #include "qmp-commands.h"
 #include "qemu/error-report.h"
@@ -199,6 +200,18 @@ IOThreadInfoList *qmp_query_iothreads(Error **errp)
 void iothread_stop_all(void)
 {
     Object *container = object_get_objects_root();
+    BlockDriverState *bs;
+    BdrvNextIterator it;
+
+    for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
+        AioContext *ctx = bdrv_get_aio_context(bs);
+        if (ctx == qemu_get_aio_context()) {
+            continue;
+        }
+        aio_context_acquire(ctx);
+        bdrv_set_aio_context(bs, qemu_get_aio_context());
+        aio_context_release(ctx);
+    }
 
     object_child_foreach(container, iothread_stop, NULL);
 }
This page took 0.030502 seconds and 4 git commands to generate.