|
@@ -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
|