mm/sl[aou]b: Do slab aliasing call from common code
authorChristoph Lameter <cl@linux.com>
Wed, 5 Sep 2012 00:18:32 +0000 (00:18 +0000)
committerPekka Enberg <penberg@kernel.org>
Wed, 5 Sep 2012 09:00:36 +0000 (12:00 +0300)
The slab aliasing logic causes some strange contortions in slub. So add
a call to deal with aliases to slab_common.c but disable it for other
slab allocators by providng stubs that fail to create aliases.

Full general support for aliases will require additional cleanup passes
and more standardization of fields in kmem_cache.

Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slab.h
mm/slab_common.c
mm/slub.c

index c4f9a361bd187bbaa7af65f7ae263e9a942f0aab..84c28f451d2d6b34782e3b91585ec3a9daf8b0e8 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -36,6 +36,16 @@ extern struct kmem_cache *kmem_cache;
 struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
        size_t align, unsigned long flags, void (*ctor)(void *));
 
+#ifdef CONFIG_SLUB
+struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
+       size_t align, unsigned long flags, void (*ctor)(void *));
+#else
+static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
+       size_t align, unsigned long flags, void (*ctor)(void *))
+{ return NULL; }
+#endif
+
+
 int __kmem_cache_shutdown(struct kmem_cache *);
 
 #endif
index f18c06fd97c7f250122028bc2906ff4476bc1d40..adc42b01b25b5e2cfbb0bdbc6483eecf5c95680f 100644 (file)
@@ -115,6 +115,10 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
                goto out_locked;
        }
 
+       s = __kmem_cache_alias(name, size, align, flags, ctor);
+       if (s)
+               goto out_locked;
+
        s = __kmem_cache_create(n, size, align, flags, ctor);
 
        if (s) {
index 91c9a2fe67606e31c931bf3de2e6e444232a849b..64d445e7a27d4f51c0fb35861c2857d5659c24a8 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3708,7 +3708,7 @@ void __init kmem_cache_init(void)
                slub_max_order = 0;
 
        kmem_size = offsetof(struct kmem_cache, node) +
-                               nr_node_ids * sizeof(struct kmem_cache_node *);
+                       nr_node_ids * sizeof(struct kmem_cache_node *);
 
        /* Allocate two kmem_caches from the page allocator */
        kmalloc_size = ALIGN(kmem_size, cache_line_size());
@@ -3922,7 +3922,7 @@ static struct kmem_cache *find_mergeable(size_t size,
        return NULL;
 }
 
-struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
+struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
                size_t align, unsigned long flags, void (*ctor)(void *))
 {
        struct kmem_cache *s;
@@ -3939,11 +3939,18 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
 
                if (sysfs_slab_alias(s, name)) {
                        s->refcount--;
-                       return NULL;
+                       s = NULL;
                }
-               return s;
        }
 
+       return s;
+}
+
+struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
+               size_t align, unsigned long flags, void (*ctor)(void *))
+{
+       struct kmem_cache *s;
+
        s = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
        if (s) {
                if (kmem_cache_open(s, name,