Skip to content
  • Peter Zijlstra's avatar
    lockstat: core infrastructure · f20786ff
    Peter Zijlstra authored
    
    
    Introduce the core lock statistics code.
    
    Lock statistics provides lock wait-time and hold-time (as well as the count
    of corresponding contention and acquisitions events). Also, the first few
    call-sites that encounter contention are tracked.
    
    Lock wait-time is the time spent waiting on the lock. This provides insight
    into the locking scheme, that is, a heavily contended lock is indicative of
    a too coarse locking scheme.
    
    Lock hold-time is the duration the lock was held, this provides a reference for
    the wait-time numbers, so they can be put into perspective.
    
      1)
        lock
      2)
        ... do stuff ..
        unlock
      3)
    
    The time between 1 and 2 is the wait-time. The time between 2 and 3 is the
    hold-time.
    
    The lockdep held-lock tracking code is reused, because it already collects locks
    into meaningful groups (classes), and because it is an existing infrastructure
    for lock instrumentation.
    
    Currently lockdep tracks lock acquisition with two hooks:
    
      lock()
        lock_acquire()
        _lock()
    
     ... code protected by lock ...
    
      unlock()
        lock_release()
        _unlock()
    
    We need to extend this with two more hooks, in order to measure contention.
    
      lock_contended() - used to measure contention events
      lock_acquired()  - completion of the contention
    
    These are then placed the following way:
    
      lock()
        lock_acquire()
        if (!_try_lock())
          lock_contended()
          _lock()
          lock_acquired()
    
     ... do locked stuff ...
    
      unlock()
        lock_release()
        _unlock()
    
    (Note: the try_lock() 'trick' is used to avoid instrumenting all platform
           dependent lock primitive implementations.)
    
    It is also possible to toggle the two lockdep features at runtime using:
    
      /proc/sys/kernel/prove_locking
      /proc/sys/kernel/lock_stat
    
    (esp. turning off the O(n^2) prove_locking functionaliy can help)
    
    [akpm@linux-foundation.org: build fixes]
    [akpm@linux-foundation.org: nuke unneeded ifdefs]
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Acked-by: default avatarIngo Molnar <mingo@elte.hu>
    Acked-by: default avatarJason Baron <jbaron@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f20786ff