Commit 1d44bcb4 authored by Waiman Long's avatar Waiman Long Committed by Ingo Molnar

locking/lockdep: Track number of zapped classes

The whole point of the lockdep dynamic key patch is to allow unused
locks to be removed from the lockdep data buffers so that existing
buffer space can be reused. However, there is no way to find out how
many unused locks are zapped and so we don't know if the zapping process
is working properly.

Add a new nr_zapped_classes counter to track that and show it in
/proc/lockdep_stats.
Signed-off-by: default avatarWaiman Long <longman@redhat.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lkml.kernel.org/r/20200206152408.24165-4-longman@redhat.com
parent b9875e98
...@@ -147,6 +147,7 @@ static DECLARE_BITMAP(list_entries_in_use, MAX_LOCKDEP_ENTRIES); ...@@ -147,6 +147,7 @@ static DECLARE_BITMAP(list_entries_in_use, MAX_LOCKDEP_ENTRIES);
#define KEYHASH_SIZE (1UL << KEYHASH_BITS) #define KEYHASH_SIZE (1UL << KEYHASH_BITS)
static struct hlist_head lock_keys_hash[KEYHASH_SIZE]; static struct hlist_head lock_keys_hash[KEYHASH_SIZE];
unsigned long nr_lock_classes; unsigned long nr_lock_classes;
unsigned long nr_zapped_classes;
#ifndef CONFIG_DEBUG_LOCKDEP #ifndef CONFIG_DEBUG_LOCKDEP
static static
#endif #endif
...@@ -4880,6 +4881,7 @@ static void zap_class(struct pending_free *pf, struct lock_class *class) ...@@ -4880,6 +4881,7 @@ static void zap_class(struct pending_free *pf, struct lock_class *class)
} }
remove_class_from_lock_chains(pf, class); remove_class_from_lock_chains(pf, class);
nr_zapped_classes++;
} }
static void reinit_class(struct lock_class *class) static void reinit_class(struct lock_class *class)
......
...@@ -130,6 +130,7 @@ extern const char *__get_key_name(const struct lockdep_subclass_key *key, ...@@ -130,6 +130,7 @@ extern const char *__get_key_name(const struct lockdep_subclass_key *key,
struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i); struct lock_class *lock_chain_get_class(struct lock_chain *chain, int i);
extern unsigned long nr_lock_classes; extern unsigned long nr_lock_classes;
extern unsigned long nr_zapped_classes;
extern unsigned long nr_list_entries; extern unsigned long nr_list_entries;
long lockdep_next_lockchain(long i); long lockdep_next_lockchain(long i);
unsigned long lock_chain_count(void); unsigned long lock_chain_count(void);
......
...@@ -343,6 +343,12 @@ static int lockdep_stats_show(struct seq_file *m, void *v) ...@@ -343,6 +343,12 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
seq_printf(m, " debug_locks: %11u\n", seq_printf(m, " debug_locks: %11u\n",
debug_locks); debug_locks);
/*
* Zappped classes and lockdep data buffers reuse statistics.
*/
seq_puts(m, "\n");
seq_printf(m, " zapped classes: %11lu\n",
nr_zapped_classes);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment