aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab_common.c
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2012-09-04 19:18:33 -0400
committerPekka Enberg <penberg@kernel.org>2012-09-05 05:00:36 -0400
commitdb265eca77000c5dafc5608975afe8dafb2a02d5 (patch)
tree1c33709fa115e8e814e515f4ee535314ed090ab1 /mm/slab_common.c
parent12c3667fb780e20360ad0bde32dfb3591ef609ad (diff)
mm/sl[aou]b: Move duping of slab name to slab_common.c
Duping of the slabname has to be done by each slab. Moving this code to slab_common avoids duplicate implementations. With this patch we have common string handling for all slab allocators. Strings passed to kmem_cache_create() are copied internally. Subsystems can create temporary strings to create slab caches. Slabs allocated in early states of bootstrap will never be freed (and those can never be freed since they are essential to slab allocator operations). During bootstrap we therefore do not have to worry about duping names. Reviewed-by: Glauber Costa <glommer@parallels.com> Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r--mm/slab_common.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 7df814e8fbea..f18c06fd97c7 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -100,6 +100,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
100{ 100{
101 struct kmem_cache *s = NULL; 101 struct kmem_cache *s = NULL;
102 int err = 0; 102 int err = 0;
103 char *n;
103 104
104 get_online_cpus(); 105 get_online_cpus();
105 mutex_lock(&slab_mutex); 106 mutex_lock(&slab_mutex);
@@ -108,16 +109,26 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
108 goto out_locked; 109 goto out_locked;
109 110
110 111
111 s = __kmem_cache_create(name, size, align, flags, ctor); 112 n = kstrdup(name, GFP_KERNEL);
112 if (!s) 113 if (!n) {
113 err = -ENOSYS; /* Until __kmem_cache_create returns code */ 114 err = -ENOMEM;
115 goto out_locked;
116 }
117
118 s = __kmem_cache_create(n, size, align, flags, ctor);
119
120 if (s) {
121 /*
122 * Check if the slab has actually been created and if it was a
123 * real instatiation. Aliases do not belong on the list
124 */
125 if (s->refcount == 1)
126 list_add(&s->list, &slab_caches);
114 127
115 /* 128 } else {
116 * Check if the slab has actually been created and if it was a 129 kfree(n);
117 * real instatiation. Aliases do not belong on the list 130 err = -ENOSYS; /* Until __kmem_cache_create returns code */
118 */ 131 }
119 if (s && s->refcount == 1)
120 list_add(&s->list, &slab_caches);
121 132
122out_locked: 133out_locked:
123 mutex_unlock(&slab_mutex); 134 mutex_unlock(&slab_mutex);
@@ -153,6 +164,7 @@ void kmem_cache_destroy(struct kmem_cache *s)
153 if (s->flags & SLAB_DESTROY_BY_RCU) 164 if (s->flags & SLAB_DESTROY_BY_RCU)
154 rcu_barrier(); 165 rcu_barrier();
155 166
167 kfree(s->name);
156 kmem_cache_free(kmem_cache, s); 168 kmem_cache_free(kmem_cache, s);
157 } else { 169 } else {
158 list_add(&s->list, &slab_caches); 170 list_add(&s->list, &slab_caches);