aboutsummaryrefslogtreecommitdiff
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)
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);
}