• Darrick J. Wong's avatar
    Merge tag 'xfs-buf-lockless-lookup-5.20' of... · 35c5a09f
    Darrick J. Wong authored
    Merge tag 'xfs-buf-lockless-lookup-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs into xfs-5.20-mergeB
    
    xfs: lockless buffer cache lookups
    
    Current work to merge the XFS inode life cycle with the VFS inode
    life cycle is finding some interesting issues. If we have a path
    that hits buffer trylocks fairly hard (e.g. a non-blocking
    background inode freeing function), we end up hitting massive
    contention on the buffer cache hash locks:
    
    -   92.71%     0.05%  [kernel]                  [k] xfs_inodegc_worker
       - 92.67% xfs_inodegc_worker
          - 92.13% xfs_inode_unlink
             - 91.52% xfs_inactive_ifree
                - 85.63% xfs_read_agi
                   - 85.61% xfs_trans_read_buf_map
                      - 85.59% xfs_buf_read_map
                         - xfs_buf_get_map
                            - 85.55% xfs_buf_find
                               - 72.87% _raw_spin_lock
                                  - do_raw_spin_lock
                                       71.86% __pv_queued_spin_lock_slowpath
                               - 8.74% xfs_buf_rele
                                  - 7.88% _raw_spin_lock
                                     - 7.88% do_raw_spin_lock
                                          7.63% __pv_queued_spin_lock_slowpath
                               - 1.70% xfs_buf_trylock
                                  - 1.68% down_trylock
                                     - 1.41% _raw_spin_lock_irqsave
                                        - 1.39% do_raw_spin_lock
                                             __pv_queued_spin_lock_slowpath
                               - 0.76% _raw_spin_unlock
                                    0.75% do_raw_spin_unlock
    
    This is basically hammering the pag->pag_buf_lock from lots of CPUs
    doing trylocks at the same time. Most of the buffer trylock
    operations ultimately fail after we've done the lookup, so we're
    really hammering the buf hash lock whilst making no progress.
    
    We can also see significant spinlock traffic on the same lock just
    under normal operation when lots of tasks are accessing metadata
    from the same AG, so let's avoid all this by creating a lookup fast
    path which leverages the rhashtable's ability to do RCU protected
    lookups.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    
    * tag 'xfs-buf-lockless-lookup-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs:
      xfs: lockless buffer lookup
      xfs: remove a superflous hash lookup when inserting new buffers
      xfs: reduce the number of atomic when locking a buffer after lookup
      xfs: merge xfs_buf_find() and xfs_buf_get_map()
      xfs: break up xfs_buf_find() into individual pieces
      xfs: rework xfs_buf_incore() API
    35c5a09f
repair.c 27.7 KB