On 04/10/2017 10:05 AM, Fam Zheng wrote: > BDRV_POLL_WHILE waits for the started I/O by releasing bs's ctx then polling > the main context, which relies on the yielded the coroutine would continue on > bs->ctx and notify qemu_aio_context with bdrv_wakeup(). Thus, using
Reads awkwardly. I'm guessing: which relies on the yielded coroutine continuing on bs->ctx before notifying qemu_aio_context with bdrv_wakeup(). > qemu_coroutine_enter to start I/O is wrong because if the coroutine is entered > from main loop, co->ctx will be qemu_aio_context, as a result of the "release, > poll, acquire" loop of BDRV_POLL_WHILE, race conditions happen when both > main thread and the iothread access the same BDS: > > aio_context_acquire(bs->ctx) > > Note that in above case, bdrv_drained_begin() doesn't do the "release, > poll, acquire" in BDRV_POLL_WHILE, because bs->in_flight == 0. > > Fix this by using bdrv_coroutine_enter and enter coroutine in the right > context. > > iotests 109 output is updated because the coroutine reenter flow during > mirror job complete is different (now through co_queue_wakeup, instead > of the unconditional qemu_coroutine_switch before), making the end job > len different. > > Signed-off-by: Fam Zheng <f...@redhat.com> > > fixup Is this leftovers during rebasing? > --- > block/block-backend.c | 4 ++-- > block/io.c | 14 +++++++------- > tests/qemu-iotests/109.out | 10 +++++----- > 3 files changed, 14 insertions(+), 14 deletions(-) > -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature