aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/slab_common.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 9c217255ac49..069a24e64403 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -168,6 +168,7 @@ void kmem_cache_destroy(struct kmem_cache *s)
168 list_del(&s->list); 168 list_del(&s->list);
169 169
170 if (!__kmem_cache_shutdown(s)) { 170 if (!__kmem_cache_shutdown(s)) {
171 mutex_unlock(&slab_mutex);
171 if (s->flags & SLAB_DESTROY_BY_RCU) 172 if (s->flags & SLAB_DESTROY_BY_RCU)
172 rcu_barrier(); 173 rcu_barrier();
173 174
@@ -175,12 +176,14 @@ void kmem_cache_destroy(struct kmem_cache *s)
175 kmem_cache_free(kmem_cache, s); 176 kmem_cache_free(kmem_cache, s);
176 } else { 177 } else {
177 list_add(&s->list, &slab_caches); 178 list_add(&s->list, &slab_caches);
179 mutex_unlock(&slab_mutex);
178 printk(KERN_ERR "kmem_cache_destroy %s: Slab cache still has objects\n", 180 printk(KERN_ERR "kmem_cache_destroy %s: Slab cache still has objects\n",
179 s->name); 181 s->name);
180 dump_stack(); 182 dump_stack();
181 } 183 }
184 } else {
185 mutex_unlock(&slab_mutex);
182 } 186 }
183 mutex_unlock(&slab_mutex);
184 put_online_cpus(); 187 put_online_cpus();
185} 188}
186EXPORT_SYMBOL(kmem_cache_destroy); 189EXPORT_SYMBOL(kmem_cache_destroy);