Skip to content
  • Kevin Wolf's avatar
    block: Use a single global AioWait · cfe29d82
    Kevin Wolf authored
    
    
    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: default avatarKevin Wolf <kwolf@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    cfe29d82