Skip to content

Commit

Permalink
[PATCH] slab: Avoid deadlock at kmem_cache_create/kmem_cache_destroy
Browse files Browse the repository at this point in the history
Prevents deadlock situation between
kmem_cache_create()/kmem_cache_destory(), and kmem_cache_create() /cpu
hotplug.  The locking order probably got moved over time.

Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: Shai Fultheim <shai@scalex86.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Ravikiran G Thirumalai authored and Linus Torvalds committed Feb 10, 2006
1 parent 8e36709 commit f0188f4
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions mm/slab.c
Original file line number Diff line number Diff line change
Expand Up @@ -1717,6 +1717,12 @@ kmem_cache_create (const char *name, size_t size, size_t align,
BUG();
}

/*
* Prevent CPUs from coming and going.
* lock_cpu_hotplug() nests outside cache_chain_mutex
*/
lock_cpu_hotplug();

mutex_lock(&cache_chain_mutex);

list_for_each(p, &cache_chain) {
Expand Down Expand Up @@ -1918,8 +1924,6 @@ kmem_cache_create (const char *name, size_t size, size_t align,
cachep->dtor = dtor;
cachep->name = name;

/* Don't let CPUs to come and go */
lock_cpu_hotplug();

if (g_cpucache_up == FULL) {
enable_cpucache(cachep);
Expand Down Expand Up @@ -1978,12 +1982,12 @@ kmem_cache_create (const char *name, size_t size, size_t align,

/* cache setup completed, link it into the list */
list_add(&cachep->next, &cache_chain);
unlock_cpu_hotplug();
oops:
if (!cachep && (flags & SLAB_PANIC))
panic("kmem_cache_create(): failed to create slab `%s'\n",
name);
mutex_unlock(&cache_chain_mutex);
unlock_cpu_hotplug();
return cachep;
}
EXPORT_SYMBOL(kmem_cache_create);
Expand Down

0 comments on commit f0188f4

Please sign in to comment.