--- mm/slub.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) Index: slub/mm/slub.c =================================================================== --- slub.orig/mm/slub.c 2007-06-04 16:57:33.000000000 -0700 +++ slub/mm/slub.c 2007-06-04 17:02:15.000000000 -0700 @@ -2611,26 +2611,28 @@ struct kmem_cache *kmem_cache_create(con */ 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, - size, align, flags, ctor)) { - if (sysfs_slab_add(s)) { - kfree(s); - goto err; - } + return s; + } + + s = kmalloc(kmem_size, GFP_KERNEL); + if (s) { + if (kmem_cache_open(s, GFP_KERNEL, name, size, align, flags, + ctor)) { list_add(&s->list, &slab_caches); + up_write(&slub_lock); + raise_kswapd_order(s->order); - } else - kfree(s); + if (!sysfs_slab_add(s)) + 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