• B
    xfs: use sync buffer I/O for sync delwri queue submission · e339dd8d
    Brian Foster 提交于
    If a delwri queue occurs of a buffer that sits on a delwri queue
    wait list, the queue sets _XBF_DELWRI_Q without changing the state
    of ->b_list. This occurs, for example, if another thread beats the
    current delwri waiter thread to the buffer lock after I/O
    completion. Once the waiter acquires the lock, it removes the buffer
    from the wait list and leaves a buffer with _XBF_DELWRI_Q set but
    not populated on a list. This results in a lost buffer submission
    and in turn can result in assert failures due to _XBF_DELWRI_Q being
    set on buffer reclaim or filesystem lockups if the buffer happens to
    cover an item in the AIL.
    
    This problem has been reproduced by repeated iterations of xfs/305
    on high CPU count (28xcpu) systems with limited memory (~1GB). Dirty
    dquot reclaim races with an xfsaild push of a separate dquot backed
    by the same buffer such that the buffer sits on the reclaim wait
    list at the time xfsaild attempts to queue it. Since the latter
    dquot has been flush locked but the underlying buffer not submitted
    for I/O, the dquot pins the AIL and causes the filesystem to
    livelock.
    
    This race is essentially made possible by the buffer lock cycle
    involved with waiting on a synchronous delwri queue submission.
    Close the race by using synchronous buffer I/O for respective delwri
    queue submission. This means the buffer remains locked across the
    I/O and so is inaccessible from other contexts while in the
    intermediate wait list state. The sync buffer I/O wait mechanism is
    factored into a helper such that sync delwri buffer submission and
    serialization are batched operations.
    Designed-by: NDave Chinner <dchinner@redhat.com>
    Signed-off-by: NBrian Foster <bfoster@redhat.com>
    Reviewed-by: NDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
    e339dd8d
xfs_buf.c 51.1 KB