mm/sl[aou]b: Move list_add() to slab_common.c
authorChristoph Lameter <cl@linux.com>
Tue, 4 Sep 2012 23:38:33 +0000 (23:38 +0000)
committerPekka Enberg <penberg@kernel.org>
Wed, 5 Sep 2012 09:00:35 +0000 (12:00 +0300)
Move the code to append the new kmem_cache to the list of slab caches to
the kmem_cache_create code in the shared code.

This is possible now since the acquisition of the mutex was moved into
kmem_cache_create().

Acked-by: David Rientjes <rientjes@google.com>
Reviewed-by: Glauber Costa <glommer@parallels.com>
Reviewed-by: Joonsoo Kim <js1304@gmail.com>
Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slab.c
mm/slab_common.c
mm/slob.c
mm/slub.c

index 3b4587bb7b19ed5b859a9f58c3a86a79d67cc2b9..a69903168497dadb0d5e7d0c4f3d4076a3703304 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1680,6 +1680,7 @@ void __init kmem_cache_init(void)
                                        ARCH_KMALLOC_FLAGS|SLAB_PANIC,
                                        NULL);
 
+       list_add(&sizes[INDEX_AC].cs_cachep->list, &slab_caches);
        if (INDEX_AC != INDEX_L3) {
                sizes[INDEX_L3].cs_cachep =
                        __kmem_cache_create(names[INDEX_L3].name,
@@ -1687,6 +1688,7 @@ void __init kmem_cache_init(void)
                                ARCH_KMALLOC_MINALIGN,
                                ARCH_KMALLOC_FLAGS|SLAB_PANIC,
                                NULL);
+               list_add(&sizes[INDEX_L3].cs_cachep->list, &slab_caches);
        }
 
        slab_early_init = 0;
@@ -1705,6 +1707,7 @@ void __init kmem_cache_init(void)
                                        ARCH_KMALLOC_MINALIGN,
                                        ARCH_KMALLOC_FLAGS|SLAB_PANIC,
                                        NULL);
+                       list_add(&sizes->cs_cachep->list, &slab_caches);
                }
 #ifdef CONFIG_ZONE_DMA
                sizes->cs_dmacachep = __kmem_cache_create(
@@ -1714,6 +1717,7 @@ void __init kmem_cache_init(void)
                                        ARCH_KMALLOC_FLAGS|SLAB_CACHE_DMA|
                                                SLAB_PANIC,
                                        NULL);
+               list_add(&sizes->cs_dmacachep->list, &slab_caches);
 #endif
                sizes++;
                names++;
@@ -2583,6 +2587,7 @@ __kmem_cache_create (const char *name, size_t size, size_t align,
        }
        cachep->ctor = ctor;
        cachep->name = name;
+       cachep->refcount = 1;
 
        if (setup_cpu_cache(cachep, gfp)) {
                __kmem_cache_destroy(cachep);
@@ -2599,8 +2604,6 @@ __kmem_cache_create (const char *name, size_t size, size_t align,
                slab_set_debugobj_lock_classes(cachep);
        }
 
-       /* cache setup completed, link it into the list */
-       list_add(&cachep->list, &slab_caches);
        return cachep;
 }
 
index fe8dc943c285c5b3627fd9fc331cb504f552eb9f..5190a7cd02bda88a3df30b4f53166cf72ad74374 100644 (file)
@@ -111,6 +111,13 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
        if (!s)
                err = -ENOSYS; /* Until __kmem_cache_create returns code */
 
+       /*
+        * Check if the slab has actually been created and if it was a
+        * real instatiation. Aliases do not belong on the list
+        */
+       if (s && s->refcount == 1)
+               list_add(&s->list, &slab_caches);
+
 out_locked:
        mutex_unlock(&slab_mutex);
        put_online_cpus();
index 45d4ca79933a84eec7e9e824f5d3117f3dc4dc64..5225d28f2694e05f9c6493319c73e578a49c94ef 100644 (file)
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -540,6 +540,10 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
 
 void kmem_cache_destroy(struct kmem_cache *c)
 {
+       mutex_lock(&slab_mutex);
+       list_del(&c->list);
+       mutex_unlock(&slab_mutex);
+
        kmemleak_free(c);
        if (c->flags & SLAB_DESTROY_BY_RCU)
                rcu_barrier();
index c669089832187609e2b394a6d89a99401ca00512..24aa362edef7607e33dca49f775767d8957b8caf 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3975,7 +3975,6 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
                                size, align, flags, ctor)) {
                        int r;
 
-                       list_add(&s->list, &slab_caches);
                        mutex_unlock(&slab_mutex);
                        r = sysfs_slab_add(s);
                        mutex_lock(&slab_mutex);
@@ -3983,7 +3982,6 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
                        if (!r)
                                return s;
 
-                       list_del(&s->list);
                        kmem_cache_close(s);
                }
                kmem_cache_free(kmem_cache, s);