• Filipe Manana's avatar
    btrfs: avoid unnecessary log mutex contention when syncing log · e1a6d264
    Filipe Manana authored
    When syncing the log we acquire the root's log mutex just to update the
    root's last_log_commit. This is unnecessary because:
    
    1) At this point there can only be one task updating this value, which is
       the task committing the current log transaction. Any task that enters
       btrfs_sync_log() has to wait for the previous log transaction to commit
       and wait for the current log transaction to commit if someone else
       already started it (in this case it never reaches to the point of
       updating last_log_commit, as that is done by the committing task);
    
    2) All readers of the root's last_log_commit don't acquire the root's
       log mutex. This is to avoid blocking the readers, potentially for too
       long and because getting a stale value of last_log_commit does not
       cause any functional problem, in the worst case getting a stale value
       results in logging an inode unnecessarily. Plus it's actually very
       rare to get a stale value that results in unnecessarily logging the
       inode.
    
    So in order to avoid unnecessary contention on the root's log mutex,
    which is used for several different purposes, like starting/joining a
    log transaction and starting writeback of a log transaction, stop
    acquiring the log mutex for updating the root's last_log_commit.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    e1a6d264
tree-log.c 177 KB