aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2012-09-04 20:18:32 -0400
committerPekka Enberg <penberg@kernel.org>2012-09-05 05:00:36 -0400
commitcbb79694d592e9a76880f6ef6db8feccaeee1c32 (patch)
tree6eb60a253bfde73214d4dc07bed860f17f737537
parentdb265eca77000c5dafc5608975afe8dafb2a02d5 (diff)
mm/sl[aou]b: Do slab aliasing call from common code
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>
-rw-r--r--mm/slab.h10
-rw-r--r--mm/slab_common.c4
-rw-r--r--mm/slub.c15
3 files changed, 25 insertions, 4 deletions
diff --git a/mm/slab.h b/mm/slab.h
index c4f9a361bd18..84c28f451d2d 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -36,6 +36,16 @@ extern struct kmem_cache *kmem_cache;
36struct kmem_cache *__kmem_cache_create(const char *name, size_t size, 36struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
37 size_t align, unsigned long flags, void (*ctor)(void *)); 37 size_t align, unsigned long flags, void (*ctor)(void *));
38 38
39#ifdef CONFIG_SLUB
40struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
41 size_t align, unsigned long flags, void (*ctor)(void *));
42#else
43static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
44 size_t align, unsigned long flags, void (*ctor)(void *))
45{ return NULL; }
46#endif
47
48
39int __kmem_cache_shutdown(struct kmem_cache *); 49int __kmem_cache_shutdown(struct kmem_cache *);
40 50
41#endif 51#endif
diff --git a/mm/slab_common.c b/mm/slab_common.c
index f18c06fd97c7..adc42b01b25b 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -115,6 +115,10 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
115 goto out_locked; 115 goto out_locked;
116 } 116 }
117 117
118 s = __kmem_cache_alias(name, size, align, flags, ctor);
119 if (s)
120 goto out_locked;
121
118 s = __kmem_cache_create(n, size, align, flags, ctor); 122 s = __kmem_cache_create(n, size, align, flags, ctor);
119 123
120 if (s) { 124 if (s) {
diff --git a/mm/slub.c b/mm/slub.c
index 91c9a2fe6760..64d445e7a27d 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3708,7 +3708,7 @@ void __init kmem_cache_init(void)
3708 slub_max_order = 0; 3708 slub_max_order = 0;
3709 3709
3710 kmem_size = offsetof(struct kmem_cache, node) + 3710 kmem_size = offsetof(struct kmem_cache, node) +
3711 nr_node_ids * sizeof(struct kmem_cache_node *); 3711 nr_node_ids * sizeof(struct kmem_cache_node *);
3712 3712
3713 /* Allocate two kmem_caches from the page allocator */ 3713 /* Allocate two kmem_caches from the page allocator */
3714 kmalloc_size = ALIGN(kmem_size, cache_line_size()); 3714 kmalloc_size = ALIGN(kmem_size, cache_line_size());
@@ -3922,7 +3922,7 @@ static struct kmem_cache *find_mergeable(size_t size,
3922 return NULL; 3922 return NULL;
3923} 3923}
3924 3924
3925struct kmem_cache *__kmem_cache_create(const char *name, size_t size, 3925struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
3926 size_t align, unsigned long flags, void (*ctor)(void *)) 3926 size_t align, unsigned long flags, void (*ctor)(void *))
3927{ 3927{
3928 struct kmem_cache *s; 3928 struct kmem_cache *s;
@@ -3939,11 +3939,18 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
3939 3939
3940 if (sysfs_slab_alias(s, name)) { 3940 if (sysfs_slab_alias(s, name)) {
3941 s->refcount--; 3941 s->refcount--;
3942 return NULL; 3942 s = NULL;
3943 } 3943 }
3944 return s;
3945 } 3944 }
3946 3945
3946 return s;
3947}
3948
3949struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
3950 size_t align, unsigned long flags, void (*ctor)(void *))
3951{
3952 struct kmem_cache *s;
3953
3947 s = kmem_cache_alloc(kmem_cache, GFP_KERNEL); 3954 s = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
3948 if (s) { 3955 if (s) {
3949 if (kmem_cache_open(s, name, 3956 if (kmem_cache_open(s, name,