Am 25.04.2023 um 19:27 hat Stefan Hajnoczi geschrieben: > For simplicity, always run BlockDevOps .drained_begin/end/poll() > callbacks in the main loop thread. This makes it easier to implement the > callbacks and avoids extra locks. > > Move the function pointer declarations from the I/O Code section to the > Global State section in block-backend-common.h. > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com>
If we're updating function pointers, we should probably update them in BdrvChildClass and BlockDriver, too. This means that a non-coroutine caller can't run in an iothread, not even the home iothread of the BlockDriverState. (I'm not sure if it was allowed previously. I don't think we're actually doing this, but in theory it could have worked.) Maybe put a GLOBAL_STATE_CODE() after handling the bdrv_co_yield_to_drain() case? Or would that look too odd? IO_OR_GS_CODE(); if (qemu_in_coroutine()) { bdrv_co_yield_to_drain(bs, true, parent, poll); return; } GLOBAL_STATE_CODE(); Kevin