Am 12.12.2022 um 13:59 hat Paolo Bonzini geschrieben: > When called from within (another) coroutine, aio_co_enter will not > enter a coroutine immediately; instead the new coroutine is scheduled > to run after qemu_coroutine_yield(). This however might cause the > currently-running coroutine to yield without having raised blk->in_flight.
I assume you're talking about the blk_aio_prwv() path here. However, calling blk_inc_in_flight() is the very first thing it does (before even calling bdrv_coroutine_enter -> aio_co_enter), so I don't understand how it could happen that it yields before increasing the counter. > If it was a ->drained_begin() callback who scheduled the coroutine, Which one? The one that executes blk_aio_prwv()? > bdrv_drained_begin() might exit without waiting for the I/O operation > to finish. Right now, this is masked by unnecessary polling done by > bdrv_drained_begin() after the callbacks return, but it is wrong and > a latent bug. > > So, ensure that blk_inc_in_flight() and blk_wait_while_drained() > are called before aio_co_enter(). To do so, pull the call to > blk_wait_while_drained() out of the blk_co_do_* functions, which are > called from the AIO coroutines, and place them separately in the public > blk_co_* functions and in blk_aio_prwv. You can't call blk_wait_while_drained() in blk_aio_prwv() because the latter isn't a coroutine_fn. > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > block/block-backend.c | 16 +++++++--------- > 1 file changed, 7 insertions(+), 9 deletions(-) Kevin