On 04.06.2014 12:01, Stefan Hajnoczi wrote:
On Mon, Jun 02, 2014 at 09:15:27AM +0200, Marcin Gibuła wrote:
When two coroutines submit I/O and first coroutine depends on second to
complete (by calling bdrv_drain_all), deadlock may occur.
bdrv_drain_all() is a very heavy-weight operation. Coroutines should
avoid it if possible. Please post the file/line/function where this
call was made, perhaps there is a better way to wait for the other
coroutine. This isn't a fix for this bug but it's a cleanup.
As in original bug report:
#4 0x00007f699c095c0a in bdrv_drain_all () at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block.c:1805
#5 0x00007f699c09c87e in bdrv_close (bs=bs@entry=0x7f699f0bc520) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block.c:1695
#6 0x00007f699c09c5fa in bdrv_delete (bs=0x7f699f0bc520) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block.c:1978
#7 bdrv_unref (bs=0x7f699f0bc520) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block.c:5198
#8 0x00007f699c09c812 in bdrv_drop_intermediate
(active=active@entry=0x7f699ebfd330, top=top@entry=0x7f699f0bc520,
base=base@entry=0x7f699eec43d0) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block.c:2567
#9 0x00007f699c0a1963 in commit_run (opaque=0x7f699f17dcc0) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/block/commit.c:144
#10 0x00007f699c0e0dca in coroutine_trampoline (i0=<optimized out>,
i1=<optimized out>) at
/var/tmp/portage/app-emulation/qemu-2.0.0_rc2/work/qemu-2.0.0-rc2/coroutine-ucontext.c:118
mirror_run probably has this as well. I didn't check others.
--
mg