mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
locking/lockdep: Add number of dynamic keys to /proc/lockdep_stats
There have been recent reports about running out of lockdep keys: MAX_LOCKDEP_KEYS too low! One possible reason is that too many dynamic keys have been registered. A possible culprit is the lockdep_register_key() call in qdisc_alloc() of net/sched/sch_generic.c. Currently, there is no way to find out how many dynamic keys have been registered. Add such a stat to the /proc/lockdep_stats to get better clarity. Signed-off-by: Waiman Long <longman@redhat.com> Signed-off-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Bill Wendling <morbo@google.com> Cc: Justin Stitt <justinstitt@google.com> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <nick.desaulniers+lkml@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Will Deacon <will@kernel.org> Cc: llvm@lists.linux.dev Link: https://lore.kernel.org/r/20250506042049.50060-4-boqun.feng@gmail.com
This commit is contained in:
parent
6a1a219f53
commit
cdb7d2d68c
|
@ -219,6 +219,7 @@ static DECLARE_BITMAP(list_entries_in_use, MAX_LOCKDEP_ENTRIES);
|
|||
static struct hlist_head lock_keys_hash[KEYHASH_SIZE];
|
||||
unsigned long nr_lock_classes;
|
||||
unsigned long nr_zapped_classes;
|
||||
unsigned long nr_dynamic_keys;
|
||||
unsigned long max_lock_class_idx;
|
||||
struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
|
||||
DECLARE_BITMAP(lock_classes_in_use, MAX_LOCKDEP_KEYS);
|
||||
|
@ -1238,6 +1239,7 @@ void lockdep_register_key(struct lock_class_key *key)
|
|||
goto out_unlock;
|
||||
}
|
||||
hlist_add_head_rcu(&key->hash_entry, hash_head);
|
||||
nr_dynamic_keys++;
|
||||
out_unlock:
|
||||
graph_unlock();
|
||||
restore_irqs:
|
||||
|
@ -6609,6 +6611,7 @@ void lockdep_unregister_key(struct lock_class_key *key)
|
|||
pf = get_pending_free();
|
||||
__lockdep_free_key_range(pf, key, 1);
|
||||
need_callback = prepare_call_rcu_zapped(pf);
|
||||
nr_dynamic_keys--;
|
||||
}
|
||||
lockdep_unlock();
|
||||
raw_local_irq_restore(flags);
|
||||
|
|
|
@ -138,6 +138,7 @@ extern unsigned long nr_lock_classes;
|
|||
extern unsigned long nr_zapped_classes;
|
||||
extern unsigned long nr_zapped_lock_chains;
|
||||
extern unsigned long nr_list_entries;
|
||||
extern unsigned long nr_dynamic_keys;
|
||||
long lockdep_next_lockchain(long i);
|
||||
unsigned long lock_chain_count(void);
|
||||
extern unsigned long nr_stack_trace_entries;
|
||||
|
|
|
@ -286,6 +286,8 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
|
|||
#endif
|
||||
seq_printf(m, " lock-classes: %11lu [max: %lu]\n",
|
||||
nr_lock_classes, MAX_LOCKDEP_KEYS);
|
||||
seq_printf(m, " dynamic-keys: %11lu\n",
|
||||
nr_dynamic_keys);
|
||||
seq_printf(m, " direct dependencies: %11lu [max: %lu]\n",
|
||||
nr_list_entries, MAX_LOCKDEP_ENTRIES);
|
||||
seq_printf(m, " indirect dependencies: %11lu\n",
|
||||
|
|
Loading…
Reference in New Issue
Block a user