SLUB: Move sysfs operations outside of slub_lock
Sysfs can do a gazillion things when called. Make sure that we do not call any sysfs functions while holding the slub_lock. Just protect the essentials: 1. The list of all slab caches 2. The kmalloc_dma array 3. The ref counters of the slabs. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									434e245ddd
								
							
						
					
					
						commit
						a0e1d1be20
					
				
							
								
								
									
										28
									
								
								mm/slub.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								mm/slub.c
									
									
									
									
									
								
							| @ -2192,12 +2192,13 @@ void kmem_cache_destroy(struct kmem_cache *s) | ||||
| 	s->refcount--; | ||||
| 	if (!s->refcount) { | ||||
| 		list_del(&s->list); | ||||
| 		up_write(&slub_lock); | ||||
| 		if (kmem_cache_close(s)) | ||||
| 			WARN_ON(1); | ||||
| 		sysfs_slab_remove(s); | ||||
| 		kfree(s); | ||||
| 	} | ||||
| 	up_write(&slub_lock); | ||||
| 	} else | ||||
| 		up_write(&slub_lock); | ||||
| } | ||||
| EXPORT_SYMBOL(kmem_cache_destroy); | ||||
| 
 | ||||
| @ -2679,25 +2680,26 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | ||||
| 		 */ | ||||
| 		s->objsize = max(s->objsize, (int)size); | ||||
| 		s->inuse = max_t(int, s->inuse, ALIGN(size, sizeof(void *))); | ||||
| 		up_write(&slub_lock); | ||||
| 		if (sysfs_slab_alias(s, name)) | ||||
| 			goto err; | ||||
| 	} else { | ||||
| 		s = kmalloc(kmem_size, GFP_KERNEL); | ||||
| 		if (s && kmem_cache_open(s, GFP_KERNEL, name, | ||||
| 		return s; | ||||
| 	} | ||||
| 	s = kmalloc(kmem_size, GFP_KERNEL); | ||||
| 	if (s) { | ||||
| 		if (kmem_cache_open(s, GFP_KERNEL, name, | ||||
| 				size, align, flags, ctor)) { | ||||
| 			if (sysfs_slab_add(s)) { | ||||
| 				kfree(s); | ||||
| 				goto err; | ||||
| 			} | ||||
| 			list_add(&s->list, &slab_caches); | ||||
| 		} else | ||||
| 			kfree(s); | ||||
| 			up_write(&slub_lock); | ||||
| 			if (sysfs_slab_add(s)) | ||||
| 				goto err; | ||||
| 			return s; | ||||
| 		} | ||||
| 		kfree(s); | ||||
| 	} | ||||
| 	up_write(&slub_lock); | ||||
| 	return s; | ||||
| 
 | ||||
| err: | ||||
| 	up_write(&slub_lock); | ||||
| 	if (flags & SLAB_PANIC) | ||||
| 		panic("Cannot create slabcache %s\n", name); | ||||
| 	else | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user