• Namhyung Kim's avatar
    perf lock contention: Fix spinlock and rwlock accounting · 287bd5cf
    Namhyung Kim authored
    The spinlock and rwlock use a single-element per-cpu array to track
    current locks due to performance reason.  But this means the key is
    always available and it cannot simply account lock stats in the array
    because some of them are invalid.
    
    In fact, the contention_end() program in the BPF invalidates the entry
    by setting the 'lock' value to 0 instead of deleting the entry for the
    hashmap.  So it should skip entries with the lock value of 0 in the
    account_end_timestamp().
    
    Otherwise, it'd have spurious high contention on an idle machine:
    
      $ sudo perf lock con -ab -Y spinlock sleep 3
       contended   total wait     max wait     avg wait         type   caller
    
               8      4.72 s       1.84 s     590.46 ms     spinlock   rcu_core+0xc7
               8      1.87 s       1.87 s     233.48 ms     spinlock   process_one_work+0x1b5
               2      1.87 s       1.87 s     933.92 ms     spinlock   worker_thread+0x1a2
               3      1.81 s       1.81 s     603.93 ms     spinlock   tmigr_update_events+0x13c
               2      1.72 s       1.72 s     861.98 ms     spinlock   tick_do_update_jiffies64+0x25
               6     42.48 us     13.02 us      7.08 us     spinlock   futex_q_lock+0x2a
               1     13.03 us     13.03 us     13.03 us     spinlock   futex_wake+0xce
               1     11.61 us     11.61 us     11.61 us     spinlock   rcu_core+0xc7
    
    I don't believe it has contention on a spinlock longer than 1 second.
    After this change, it only reports some small contentions.
    
      $ sudo perf lock con -ab -Y spinlock sleep 3
       contended   total wait     max wait     avg wait         type   caller
    
               4    133.51 us     43.29 us     33.38 us     spinlock   tick_do_update_jiffies64+0x25
               4     69.06 us     31.82 us     17.27 us     spinlock   process_one_work+0x1b5
               2     50.66 us     25.77 us     25.33 us     spinlock   rcu_core+0xc7
               1     28.45 us     28.45 us     28.45 us     spinlock   rcu_core+0xc7
               1     24.77 us     24.77 us     24.77 us     spinlock   tmigr_update_events+0x13c
               1     23.34 us     23.34 us     23.34 us     spinlock   raw_spin_rq_lock_nested+0x15
    
    Fixes: b5711042 ("perf lock contention: Use per-cpu array map for spinlocks")
    Reported-by: default avatarXi Wang <xii@google.com>
    Cc: Song Liu <song@kernel.org>
    Cc: bpf@vger.kernel.org
    Link: https://lore.kernel.org/r/20240828052953.1445862-1-namhyung@kernel.orgSigned-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    287bd5cf
bpf_lock_contention.c 13 KB