• Kent Overstreet's avatar
    lockdep: Add lock_set_cmp_fn() annotation · eb1cfd09
    Kent Overstreet authored
    This implements a new interface to lockdep, lock_set_cmp_fn(), for
    defining a custom ordering when taking multiple locks of the same
    class.
    
    This is an alternative to subclasses, but can not fully replace them
    since subclasses allow lock hierarchies with other clasees
    inter-twined, while this relies on pure class nesting.
    
    Specifically, if A is our nesting class then:
    
      A/0 <- B <- A/1
    
    Would be a valid lock order with subclasses (each subclass really is a
    full class from the validation PoV) but not with this annotation,
    which requires all nesting to be consecutive.
    
    Example output:
    
    | ============================================
    | WARNING: possible recursive locking detected
    | 6.2.0-rc8-00003-g7d81e591ca6a-dirty #15 Not tainted
    | --------------------------------------------
    | kworker/14:3/938 is trying to acquire lock:
    | ffff8880143218c8 (&b->lock l=0 0:2803368){++++}-{3:3}, at: bch_btree_node_get.part.0+0x81/0x2b0
    |
    | but task is already holding lock:
    | ffff8880143de8c8 (&b->lock l=1 1048575:9223372036854775807){++++}-{3:3}, at: __bch_btree_map_nodes+0xea/0x1e0
    | and the lock comparison function returns 1:
    |
    | other info that might help us debug this:
    |  Possible unsafe locking scenario:
    |
    |        CPU0
    |        ----
    |   lock(&b->lock l=1 1048575:9223372036854775807);
    |   lock(&b->lock l=0 0:2803368);
    |
    |  *** DEADLOCK ***
    |
    |  May be due to missing lock nesting notation
    |
    | 3 locks held by kworker/14:3/938:
    |  #0: ffff888005ea9d38 ((wq_completion)bcache){+.+.}-{0:0}, at: process_one_work+0x1ec/0x530
    |  #1: ffff8880098c3e70 ((work_completion)(&cl->work)#3){+.+.}-{0:0}, at: process_one_work+0x1ec/0x530
    |  #2: ffff8880143de8c8 (&b->lock l=1 1048575:9223372036854775807){++++}-{3:3}, at: __bch_btree_map_nodes+0xea/0x1e0
    
    [peterz: extended changelog]
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20230509195847.1745548-1-kent.overstreet@linux.dev
    eb1cfd09
lockdep.c 171 KB