summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2016-10-27 12:49:00 +0200
committerFam Zheng <famz@redhat.com>2016-10-28 21:50:18 +0800
commitd16341fa6998c530db17cbb7d5c781913e674255 (patch)
treecda2c6978a70ca768fab7333186e0ccffad6103e
parente437016511edb0dfa13cc98587c39590eaa2609a (diff)
downloadfocaccia-qemu-d16341fa6998c530db17cbb7d5c781913e674255.tar.gz
focaccia-qemu-d16341fa6998c530db17cbb7d5c781913e674255.zip
iothread: detach all block devices before stopping them
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 <pbonzini@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Message-Id: <1477565348-5458-13-git-send-email-pbonzini@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
-rw-r--r--iothread.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/iothread.c b/iothread.c
index 62c8796619..fdfb440fc4 100644
--- a/iothread.c
+++ b/iothread.c
@@ -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);
 }