• Dave Chinner's avatar
    xfs: convert CIL to unordered per cpu lists · c0fb4765
    Dave Chinner authored
    So that we can remove the cil_lock which is a global serialisation
    point. We've already got ordering sorted, so all we need to do is
    treat the CIL list like the busy extent list and reconstruct it
    before the push starts.
    
    This is what we're trying to avoid:
    
     -   75.35%     1.83%  [kernel]            [k] xfs_log_commit_cil
        - 46.35% xfs_log_commit_cil
           - 41.54% _raw_spin_lock
              - 67.30% do_raw_spin_lock
                   66.96% __pv_queued_spin_lock_slowpath
    
    Which happens on a 32p system when running a 32-way 'rm -rf'
    workload. After this patch:
    
    -   20.90%     3.23%  [kernel]               [k] xfs_log_commit_cil
       - 17.67% xfs_log_commit_cil
          - 6.51% xfs_log_ticket_ungrant
               1.40% xfs_log_space_wake
            2.32% memcpy_erms
          - 2.18% xfs_buf_item_committing
             - 2.12% xfs_buf_item_release
                - 1.03% xfs_buf_unlock
                     0.96% up
                  0.72% xfs_buf_rele
            1.33% xfs_inode_item_format
            1.19% down_read
            0.91% up_read
            0.76% xfs_buf_item_format
          - 0.68% kmem_alloc_large
             - 0.67% kmem_alloc
                  0.64% __kmalloc
            0.50% xfs_buf_item_size
    
    It kinda looks like the workload is running out of log space all
    the time. But all the spinlock contention is gone and the
    transaction commit rate has gone from 800k/s to 1.3M/s so the amount
    of real work being done has gone up a *lot*.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    c0fb4765
xfs_log_cil.c 57.2 KB