diff --git a/mm/slab_common.c b/mm/slab_common.c index 932d13ada36c..baa934cad7ac 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -479,6 +479,9 @@ static void kmem_cache_release(struct kmem_cache *s) void slab_kmem_cache_release(struct kmem_cache *s) { +#if !IS_ENABLED(CONFIG_SLUB_TINY) && IS_ENABLED(CONFIG_PREEMPT_RT) + lockdep_unregister_key(&s->lock_key); +#endif __kmem_cache_release(s); kfree_const(s->name); kmem_cache_free(kmem_cache, s); diff --git a/mm/slub.c b/mm/slub.c index 584a5ff1828b..fd7eadead46b 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -7692,9 +7692,6 @@ void __kmem_cache_release(struct kmem_cache *s) if (s->cpu_sheaves) pcs_destroy(s); #ifndef CONFIG_SLUB_TINY -#ifdef CONFIG_PREEMPT_RT - lockdep_unregister_key(&s->lock_key); -#endif free_percpu(s->cpu_slab); #endif free_kmem_cache_nodes(s); @@ -8491,7 +8488,7 @@ int do_kmem_cache_create(struct kmem_cache *s, const char *name, #endif if (!calculate_sizes(args, s)) - goto out; + goto release; if (disable_higher_order_debug) { /* * Disable debugging flags that store metadata if the min slab @@ -8501,7 +8498,7 @@ int do_kmem_cache_create(struct kmem_cache *s, const char *name, s->flags &= ~DEBUG_METADATA_FLAGS; s->offset = 0; if (!calculate_sizes(args, s)) - goto out; + goto release; } } @@ -8526,7 +8523,7 @@ int do_kmem_cache_create(struct kmem_cache *s, const char *name, s->cpu_sheaves = alloc_percpu(struct slub_percpu_sheaves); if (!s->cpu_sheaves) { err = -ENOMEM; - goto out; + goto release; } // TODO: increase capacity to grow slab_sheaf up to next kmalloc size? s->sheaf_capacity = args->sheaf_capacity; @@ -8539,14 +8536,14 @@ int do_kmem_cache_create(struct kmem_cache *s, const char *name, /* Initialize the pre-computed randomized freelist if slab is up */ if (slab_state >= UP) { if (init_cache_random_seq(s)) - goto out; + goto release; } if (!init_kmem_cache_nodes(s)) - goto out; + goto release; if (!alloc_kmem_cache_cpus(s)) - goto out; + goto release; if (s->cpu_sheaves) { err = init_percpu_sheaves(s); @@ -8571,8 +8568,13 @@ int do_kmem_cache_create(struct kmem_cache *s, const char *name, debugfs_slab_add(s); out: - if (err) + if (err) { +#if !IS_ENABLED(CONFIG_SLUB_TINY) && IS_ENABLED(CONFIG_PREEMPT_RT) + lockdep_unregister_key(&s->lock_key); +#endif +release: __kmem_cache_release(s); + } return err; }