On 20.09.18 18:19, Kevin Wolf wrote: > When draining a block node, we recurse to its parent and for subtree > drains also to its children. A single AIO_WAIT_WHILE() is then used to > wait for bdrv_drain_poll() to become true, which depends on all of the > nodes we recursed to. However, if the respective child or parent becomes > quiescent and calls bdrv_wakeup(), only the AioWait of the child/parent > is checked, while AIO_WAIT_WHILE() depends on the AioWait of the > original node. > > Fix this by using a single AioWait for all callers of AIO_WAIT_WHILE(). > > This may mean that the draining thread gets a few more unnecessary > wakeups because an unrelated operation got completed, but we already > wake it up when something _could_ have changed rather than only if it > has certainly changed. > > Apart from that, drain is a slow path anyway. In theory it would be > possible to use wakeups more selectively and still correctly, but the > gains are likely not worth the additional complexity. In fact, this > patch is a nice simplification for some places in the code. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > include/block/aio-wait.h | 11 +++++------ > include/block/block.h | 6 +----- > include/block/block_int.h | 3 --- > include/block/blockjob.h | 10 ---------- > block.c | 5 ----- > block/block-backend.c | 11 ++++------- > block/io.c | 7 ++----- > blockjob.c | 13 +------------ > job.c | 3 +-- > util/aio-wait.c | 11 ++++++----- > 10 files changed, 20 insertions(+), 60 deletions(-)
Reviewed-by: Max Reitz <mre...@redhat.com>
signature.asc
Description: OpenPGP digital signature