]> git.proxmox.com Git - mirror_qemu.git/commit - async.c
block: only call aio_poll on the current thread's AioContext
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 27 Oct 2016 10:49:05 +0000 (12:49 +0200)
committerFam Zheng <famz@redhat.com>
Fri, 28 Oct 2016 13:50:18 +0000 (21:50 +0800)
commitc9d1a56174339b0afdef63b7d151b38f4bb6dae5
tree1eb8359be422f1abbf98c5781cee063163861f67
parent9e944cb4744b527dd93aa989023739375a8880fb
block: only call aio_poll on the current thread's AioContext

aio_poll is not thread safe; for example bdrv_drain can hang if
the last in-flight I/O operation is completed in the I/O thread after
the main thread has checked bs->in_flight.

The bug remains latent as long as all of it is called within
aio_context_acquire/aio_context_release, but this will change soon.

To fix this, if bdrv_drain is called from outside the I/O thread,
signal the main AioContext through a dummy bottom half.  The event
loop then only runs in the I/O thread.

Reviewed-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1477565348-5458-18-git-send-email-pbonzini@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
async.c
block.c
block/io.c
block/nfs.c
block/sheepdog.c
hw/scsi/virtio-scsi-dataplane.c
include/block/block.h
include/block/block_int.h