[RFC/PATCH 1/2] slub: Break out alloc_kmem_cache_cpus() from kmem_cache_open()

From: Pekka Enberg
Date: Mon Apr 25 2011 - 13:46:57 EST


In preparation for sharing per-CPU structures between merged caches, break out
alloc_kmem_cache_cpus() from kmem_cache_open() function.

Cc: Christoph Lameter <cl@xxxxxxxxx>
Cc: David Rientjes <rientjes@xxxxxxxxxx>
Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Pekka Enberg <penberg@xxxxxxxxxx>
---
mm/slub.c | 37 +++++++++++++++++++++----------------
1 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/mm/slub.c b/mm/slub.c
index 94d2a33..cb61024 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2638,11 +2638,7 @@ static int kmem_cache_open(struct kmem_cache *s,
#endif
if (!init_kmem_cache_nodes(s))
goto error;
-
- if (alloc_kmem_cache_cpus(s))
- return 1;
-
- free_kmem_cache_nodes(s);
+ return 1;
error:
if (flags & SLAB_PANIC)
panic("Cannot create slab %s size=%lu realsize=%u "
@@ -2818,6 +2814,9 @@ static struct kmem_cache *__init create_kmalloc_cache(const char *name,
flags, NULL))
goto panic;

+ if (!alloc_kmem_cache_cpus(s))
+ goto panic;
+
list_add(&s->list, &slab_caches);
return s;

@@ -3239,6 +3238,8 @@ void __init kmem_cache_init(void)
sizeof(struct kmem_cache_node),
0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);

+ alloc_kmem_cache_cpus(kmem_cache_node);
+
hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI);

/* Able to allocate the per node structures */
@@ -3247,6 +3248,8 @@ void __init kmem_cache_init(void)
temp_kmem_cache = kmem_cache;
kmem_cache_open(kmem_cache, "kmem_cache", kmem_size,
0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
+ alloc_kmem_cache_cpus(kmem_cache);
+
kmem_cache = kmem_cache_alloc(kmem_cache, GFP_NOWAIT);
memcpy(kmem_cache, temp_kmem_cache, kmem_size);

@@ -3469,18 +3472,20 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,

s = kmalloc(kmem_size, GFP_KERNEL);
if (s) {
- if (kmem_cache_open(s, n,
- size, align, flags, ctor)) {
- list_add(&s->list, &slab_caches);
- if (sysfs_slab_add(s)) {
- list_del(&s->list);
- kfree(n);
- kfree(s);
- goto err;
- }
- up_write(&slub_lock);
- return s;
+ if (!kmem_cache_open(s, n, size, align, flags, ctor))
+ goto err_free;
+
+ if (!alloc_kmem_cache_cpus(s))
+ goto err_free;
+
+ list_add(&s->list, &slab_caches);
+ if (sysfs_slab_add(s)) {
+ list_del(&s->list);
+ goto err_free;
}
+ up_write(&slub_lock);
+ return s;
+err_free:
kfree(n);
kfree(s);
}
--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/