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>
This commit is contained in:
parent
e437016511
commit
d16341fa69
13
iothread.c
13
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user