diff options
author | Christoph Lameter <cl@linux.com> | 2012-07-06 16:25:13 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-07-09 05:13:42 -0400 |
commit | 20cea9683ecc6dd75a80c0dd02dc69c64e95be75 (patch) | |
tree | c52994730d2d280f9300197cc4f561b15e3dd4b2 /mm/slab_common.c | |
parent | 18004c5d4084d965aa1396392706b8688306427a (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.c | 41 |
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 | ||
101 | oops: | ||
102 | mutex_unlock(&slab_mutex); | ||
103 | put_online_cpus(); | ||
104 | |||
66 | #ifdef CONFIG_DEBUG_VM | 105 | #ifdef CONFIG_DEBUG_VM |
67 | out: | 106 | out: |
68 | #endif | 107 | #endif |