• Dave Chinner's avatar
    xfs: push the AIL in xlog_grant_head_wake · 7c107afb
    Dave Chinner authored
    In the situation where the log is full and the CIL has not recently
    flushed, the AIL push threshold is throttled back to the where the
    last write of the head of the log was completed. This is stored in
    log->l_last_sync_lsn. Hence if the CIL holds > 25% of the log space
    pinned by flushes and/or aggregation in progress, we can get the
    situation where the head of the log lags a long way behind the
    reservation grant head.
    
    When this happens, the AIL push target is trimmed back from where
    the reservation grant head wants to push the log tail to, back to
    where the head of the log currently is. This means the push target
    doesn't reach far enough into the log to actually move the tail
    before the transaction reservation goes to sleep.
    
    When the CIL push completes, it moves the log head forward such that
    the AIL push target can now be moved, but that has no mechanism for
    puhsing the log tail. Further, if the next tail movement of the log
    is not large enough wake the waiter (i.e. still not enough space for
    it to have a reservation granted), we don't wake anything up, and
    hence we do not update the AIL push target to take into account the
    head of the log moving and allowing the push target to be moved
    forwards.
    
    To avoid this particular condition, if we fail to wake the first
    waiter on the grant head because we don't have enough space,
    push on the AIL again. This will pick up any movement of the log
    head and allow the push target to move forward due to completion of
    CIL pushing.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    7c107afb
xfs_log.c 111 KB