mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	[PATCH] slab: Avoid deadlock at kmem_cache_create/kmem_cache_destroy
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>
This commit is contained in:
		
							parent
							
								
									8e36709d8c
								
							
						
					
					
						commit
						f0188f4748
					
				
					 1 changed files with 7 additions and 3 deletions
				
			
		
							
								
								
									
										10
									
								
								mm/slab.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								mm/slab.c
									
										
									
									
									
								
							|  | @ -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) { | ||||
|  | @ -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); | ||||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ravikiran G Thirumalai
						Ravikiran G Thirumalai