On 4/27/20 9:39 AM, Vladimir Sementsov-Ogievskiy wrote:
It's safer to expand in_flight request to start before enter to
coroutine in synchronous wrappers and end after BDRV_POLL_WHILE loop.
Note that qemu_coroutine_enter may only schedule the coroutine in some
circumstances.
See my wording suggestions earlier in the series.
bdrv_make_zero update includes refactoring: move the whole loop into
coroutine, which has additional benefit of not create/enter new
coroutine on each iteration.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
block/io.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 51 insertions(+), 3 deletions(-)
+int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags)
+{
+ int ret;
+
+ bdrv_inc_in_flight(child->bs);
+
+ if (qemu_in_coroutine()) {
+ /* Fast-path if already in coroutine context */
+ ret = bdrv_do_make_zero(child, flags);
+ } else {
+ BdrvDoMakeZeroData data = {
+ .child = child,
+ .flags = flags,
+ .done = false,
Another case where the line '.done = false,' is optional, thanks to C
semantics, but does not hurt to leave it in.
Reviewed-by: Eric Blake <[email protected]>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org