• Dave Chinner's avatar
    xfs: xlog_sync() manually adjusts grant head space · d9f68777
    Dave Chinner authored
    When xlog_sync() rounds off the tail the iclog that is being
    flushed, it manually subtracts that space from the grant heads. This
    space is actually reserved by the transaction ticket that covers
    the xlog_sync() call from xlog_write(), but we don't plumb the
    ticket down far enough for it to account for the space consumed in
    the current log ticket.
    
    The grant heads are hot, so we really should be accounting this to
    the ticket is we can, rather than adding thousands of extra grant
    head updates every CIL commit.
    
    Interestingly, this actually indicates a potential log space overrun
    can occur when we force the log. By the time that xfs_log_force()
    pushes out an active iclog and consumes the roundoff space, the
    reservation for that roundoff space has been returned to the grant
    heads and is no longer covered by a reservation. In theory the
    roundoff added to log force on an already full log could push the
    write head past the tail. In practice, the CIL commit that writes to
    the log and needs the iclog pushed will have reserved space for
    roundoff, so when it releases the ticket there will still be
    physical space for the roundoff to be committed to the log, even
    though it is no longer reserved. This roundoff won't be enough space
    to allow a transaction to be woken if the log is full, so overruns
    should not actually occur in practice.
    
    That said, it indicates that we should not release the CIL context
    log ticket until after we've released the commit iclog. It also
    means that xlog_sync() still needs the direct grant head
    manipulation if we don't provide it with a ticket. Log forces are
    rare when we are in fast paths running 1.5 million transactions/s
    that make the grant heads hot, so let's optimise the hot case and
    pass CIL log tickets down to the xlog_sync() code.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    d9f68777
xfs_log_priv.h 25.7 KB