• Brian Foster's avatar
    xfs: re-enable xfsaild idle mode and fix associated races · 8375f922
    Brian Foster authored
    xfsaild idle mode logic currently leads to a couple hangs:
    
    1.) If xfsaild is rescheduled in during an incremental scan
        (i.e., tout != 0) and the target has been updated since
        the previous run, we can hit the new target and go into
        idle mode with a still populated ail.
    2.) A wake up is only issued when the target is pushed forward.
        The wake up can race with xfsaild if it is currently in the
        process of entering idle mode, causing future wake up
        events to be lost.
    
    These hangs have been reproduced and verified as fixed by
    running xfstests 273 in a loop on a slightly modified upstream
    kernel. The kernel is modified to re-enable idle mode as
    previously implemented (when count == 0) and with a revert of
    commit 670ce93f, which includes performance improvements that
    make this harder to reproduce.
    
    The solution, the algorithm for which has been outlined by
    Dave Chinner, is to modify xfsaild to enter idle mode only when
    the ail is empty and the push target has not been moved forward
    since the last push.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarBen Myers <bpm@sgi.com>
    8375f922
xfs_trans_ail.c 20.9 KB