Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lockdep: lockdep_set_notrack_class()

Add a new helper to disable lockdep tracking entirely for a given class.

This is needed for bcachefs, which takes too many btree node locks for
lockdep to track. Instead, we have a single lockdep_map for "btree_trans
has any btree nodes locked", which makes more since given that we have
centralized lock management and a cycle detector.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Will Deacon <will@kernel.org>
Cc: Waiman Long <longman@redhat.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+14 -2
+1 -1
fs/bcachefs/btree_locking.c
··· 10 10 enum six_lock_init_flags flags) 11 11 { 12 12 __six_lock_init(&b->lock, "b->c.lock", &bch2_btree_node_lock_key, flags); 13 - lockdep_set_novalidate_class(&b->lock); 13 + lockdep_set_notrack_class(&b->lock); 14 14 } 15 15 16 16 #ifdef CONFIG_LOCKDEP
+4
include/linux/lockdep.h
··· 181 181 #define lockdep_set_novalidate_class(lock) \ 182 182 lockdep_set_class_and_name(lock, &__lockdep_no_validate__, #lock) 183 183 184 + #define lockdep_set_notrack_class(lock) \ 185 + lockdep_set_class_and_name(lock, &__lockdep_no_track__, #lock) 186 + 184 187 /* 185 188 * Compare locking classes 186 189 */ ··· 341 338 #define lockdep_set_subclass(lock, sub) do { } while (0) 342 339 343 340 #define lockdep_set_novalidate_class(lock) do { } while (0) 341 + #define lockdep_set_notrack_class(lock) do { } while (0) 344 342 345 343 /* 346 344 * We don't define lockdep_match_class() and lockdep_match_key() for !LOCKDEP
+1
include/linux/lockdep_types.h
··· 80 80 }; 81 81 82 82 extern struct lock_class_key __lockdep_no_validate__; 83 + extern struct lock_class_key __lockdep_no_track__; 83 84 84 85 struct lock_trace; 85 86
+8 -1
kernel/locking/lockdep.c
··· 4918 4918 struct lock_class_key __lockdep_no_validate__; 4919 4919 EXPORT_SYMBOL_GPL(__lockdep_no_validate__); 4920 4920 4921 + struct lock_class_key __lockdep_no_track__; 4922 + EXPORT_SYMBOL_GPL(__lockdep_no_track__); 4923 + 4921 4924 #ifdef CONFIG_PROVE_LOCKING 4922 4925 void lockdep_set_lock_cmp_fn(struct lockdep_map *lock, lock_cmp_fn cmp_fn, 4923 4926 lock_print_fn print_fn) ··· 5003 5000 u64 chain_key; 5004 5001 5005 5002 if (unlikely(!debug_locks)) 5003 + return 0; 5004 + 5005 + if (unlikely(lock->key == &__lockdep_no_track__)) 5006 5006 return 0; 5007 5007 5008 5008 if (!prove_locking || lock->key == &__lockdep_no_validate__) ··· 5770 5764 5771 5765 trace_lock_release(lock, ip); 5772 5766 5773 - if (unlikely(!lockdep_enabled())) 5767 + if (unlikely(!lockdep_enabled() || 5768 + lock->key == &__lockdep_no_track__)) 5774 5769 return; 5775 5770 5776 5771 raw_local_irq_save(flags);