Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> --- lib/Kconfig.debug | 2 +- mm/slub.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index ebe33181b6e6..94c07b84ecd0 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1526,7 +1526,7 @@ config LOCKDEP_BITS int "Size for MAX_LOCKDEP_ENTRIES (as Nth power of 2)" depends on LOCKDEP && !LOCKDEP_SMALL range 10 24 - default 15 + default 16 help Try increasing this value if you hit "BUG: MAX_LOCKDEP_ENTRIES too low!" message. diff --git a/mm/slub.c b/mm/slub.c index 2f30b85fbf68..2ae6bf3ebcd0 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -395,6 +395,7 @@ struct kmem_cache_cpu { struct slab *partial; /* Partially allocated slabs */ #endif local_trylock_t lock; /* Protects the fields above */ + struct lock_class_key lock_key; #ifdef CONFIG_SLUB_STATS unsigned int stat[NR_SLUB_STAT_ITEMS]; #endif @@ -3083,6 +3084,8 @@ static void init_kmem_cache_cpus(struct kmem_cache *s) for_each_possible_cpu(cpu) { c = per_cpu_ptr(s->cpu_slab, cpu); local_trylock_init(&c->lock); + lockdep_register_key(&c->lock_key); + lockdep_set_class(&c->lock, &c->lock_key); c->tid = init_tid(cpu); } } @@ -5953,6 +5956,16 @@ void __kmem_cache_release(struct kmem_cache *s) { cache_random_seq_destroy(s); #ifndef CONFIG_SLUB_TINY + { + int cpu; + + for_each_possible_cpu(cpu) { + struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, + cpu); + + lockdep_unregister_key(&c->lock_key); + } + } free_percpu(s->cpu_slab); #endif free_kmem_cache_nodes(s); -- 2.47.1