Skip to content
  • Peter Zijlstra's avatar
    lockdep: Implement lock pinning · a24fc60d
    Peter Zijlstra authored
    
    
    Add a lockdep annotation that WARNs if you 'accidentially' unlock a
    lock.
    
    This is especially helpful for code with callbacks, where the upper
    layer assumes a lock remains taken but a lower layer thinks it maybe
    can drop and reacquire the lock.
    
    By unwittingly breaking up the lock, races can be introduced.
    
    Lock pinning is a lockdep annotation that helps with this, when you
    lockdep_pin_lock() a held lock, any unlock without a
    lockdep_unpin_lock() will produce a WARN. Think of this as a relative
    of lockdep_assert_held(), except you don't only assert its held now,
    but ensure it stays held until you release your assertion.
    
    RFC: a possible alternative API would be something like:
    
      int cookie = lockdep_pin_lock(&foo);
      ...
      lockdep_unpin_lock(&foo, cookie);
    
    Where we pick a random number for the pin_count; this makes it
    impossible to sneak a lock break in without also passing the right
    cookie along.
    
    I've not done this because it ends up generating code for !LOCKDEP,
    esp. if you need to pass the cookie around for some reason.
    
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: ktkhai@parallels.com
    Cc: rostedt@goodmis.org
    Cc: juri.lelli@gmail.com
    Cc: pang.xunlei@linaro.org
    Cc: oleg@redhat.com
    Cc: wanpeng.li@linux.intel.com
    Cc: umgwanakikbuti@gmail.com
    Link: http://lkml.kernel.org/r/20150611124743.906731065@infradead.org
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    a24fc60d