Skip to content

Commit

Permalink
iothread: detach all block devices before stopping them
Browse files Browse the repository at this point in the history
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: <[email protected]>
Signed-off-by: Fam Zheng <[email protected]>
  • Loading branch information
bonzini authored and Fam Zheng committed Oct 28, 2016
1 parent e437016 commit d16341f
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions iothread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
}

0 comments on commit d16341f

Please sign in to comment.