aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab_common.c
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2012-07-06 16:25:13 -0400
committerPekka Enberg <penberg@kernel.org>2012-07-09 05:13:42 -0400
commit20cea9683ecc6dd75a80c0dd02dc69c64e95be75 (patch)
treec52994730d2d280f9300197cc4f561b15e3dd4b2 /mm/slab_common.c
parent18004c5d4084d965aa1396392706b8688306427a (diff)
mm, sl[aou]b: Move kmem_cache_create mutex handling to common code
Move the mutex handling into the common kmem_cache_create() function. Then we can also move more checks out of SLAB's kmem_cache_create() into the common code. 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.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 50e1ff10bff9..12637cee1f95 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -11,7 +11,8 @@
11#include <linux/memory.h> 11#include <linux/memory.h>
12#include <linux/compiler.h> 12#include <linux/compiler.h>
13#include <linux/module.h> 13#include <linux/module.h>
14 14#include <linux/cpu.h>
15#include <linux/uaccess.h>
15#include <asm/cacheflush.h> 16#include <asm/cacheflush.h>
16#include <asm/tlbflush.h> 17#include <asm/tlbflush.h>
17#include <asm/page.h> 18#include <asm/page.h>
@@ -61,8 +62,46 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
61 } 62 }
62#endif 63#endif
63 64
65 get_online_cpus();
66 mutex_lock(&slab_mutex);
67
68#ifdef CONFIG_DEBUG_VM
69 list_for_each_entry(s, &slab_caches, list) {
70 char tmp;
71 int res;
72
73 /*
74 * This happens when the module gets unloaded and doesn't
75 * destroy its slab cache and no-one else reuses the vmalloc
76 * area of the module. Print a warning.
77 */
78 res = probe_kernel_address(s->name, tmp);
79 if (res) {
80 printk(KERN_ERR
81 "Slab cache with size %d has lost its name\n",
82 s->object_size);
83 continue;
84 }
85
86 if (!strcmp(s->name, name)) {
87 printk(KERN_ERR "kmem_cache_create(%s): Cache name"
88 " already exists.\n",
89 name);
90 dump_stack();
91 s = NULL;
92 goto oops;
93 }
94 }
95
96 WARN_ON(strchr(name, ' ')); /* It confuses parsers */
97#endif
98
64 s = __kmem_cache_create(name, size, align, flags, ctor); 99 s = __kmem_cache_create(name, size, align, flags, ctor);
65 100
101oops:
102 mutex_unlock(&slab_mutex);
103 put_online_cpus();
104
66#ifdef CONFIG_DEBUG_VM 105#ifdef CONFIG_DEBUG_VM
67out: 106out:
68#endif 107#endif