Many places do: if (kmem_cache_create(...) == NULL) panic(...); We can consolidate all that by passing another flag to kmem_cache_create() diff -upN reference/fs/aio.c current/fs/aio.c --- reference/fs/aio.c 2004-04-07 14:54:28.000000000 -0700 +++ current/fs/aio.c 2004-05-01 10:20:57.000000000 -0700 @@ -64,14 +64,9 @@ static void aio_kick_handler(void *); static int __init aio_setup(void) { kiocb_cachep = kmem_cache_create("kiocb", sizeof(struct kiocb), - 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!kiocb_cachep) - panic("unable to create kiocb cache\n"); - + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); kioctx_cachep = kmem_cache_create("kioctx", sizeof(struct kioctx), - 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!kioctx_cachep) - panic("unable to create kioctx cache"); + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); aio_wq = create_workqueue("aio"); diff -upN reference/fs/bio.c current/fs/bio.c --- reference/fs/bio.c 2004-04-07 14:54:28.000000000 -0700 +++ current/fs/bio.c 2004-05-01 10:20:57.000000000 -0700 @@ -808,9 +808,7 @@ static void __init biovec_init_pools(voi size = bp->nr_vecs * sizeof(struct bio_vec); bp->slab = kmem_cache_create(bp->name, size, 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!bp->slab) - panic("biovec: can't init slab cache\n"); + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); if (i >= scale) pool_entries >>= 1; @@ -825,16 +823,16 @@ static void __init biovec_init_pools(voi static int __init init_bio(void) { bio_slab = kmem_cache_create("bio", sizeof(struct bio), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!bio_slab) - panic("bio: can't create slab cache\n"); - bio_pool = mempool_create(BIO_POOL_SIZE, mempool_alloc_slab, mempool_free_slab, bio_slab); + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); + bio_pool = mempool_create(BIO_POOL_SIZE, mempool_alloc_slab, + mempool_free_slab, bio_slab); if (!bio_pool) panic("bio: can't create mempool\n"); biovec_init_pools(); - bio_split_pool = mempool_create(BIO_SPLIT_ENTRIES, bio_pair_alloc, bio_pair_free, NULL); + bio_split_pool = mempool_create(BIO_SPLIT_ENTRIES, + bio_pair_alloc, bio_pair_free, NULL); if (!bio_split_pool) panic("bio: can't create split pool\n"); diff -upN reference/fs/block_dev.c current/fs/block_dev.c --- reference/fs/block_dev.c 2004-04-30 11:23:39.000000000 -0700 +++ current/fs/block_dev.c 2004-05-01 10:20:57.000000000 -0700 @@ -303,14 +303,9 @@ struct super_block *blockdev_superblock; void __init bdev_cache_init(void) { int err; - bdev_cachep = kmem_cache_create("bdev_cache", - sizeof(struct bdev_inode), - 0, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, - init_once, - NULL); - if (!bdev_cachep) - panic("Cannot create bdev_cache SLAB cache"); + bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode), + 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_PANIC, + init_once, NULL); err = register_filesystem(&bd_type); if (err) panic("Cannot register bdev pseudo-fs"); diff -upN reference/fs/buffer.c current/fs/buffer.c --- reference/fs/buffer.c 2004-04-30 11:23:39.000000000 -0700 +++ current/fs/buffer.c 2004-05-01 10:20:57.000000000 -0700 @@ -3035,7 +3035,7 @@ void __init buffer_init(void) bh_cachep = kmem_cache_create("buffer_head", sizeof(struct buffer_head), 0, - 0, init_buffer_head, NULL); + SLAB_PANIC, init_buffer_head, NULL); for (i = 0; i < ARRAY_SIZE(bh_wait_queue_heads); i++) init_waitqueue_head(&bh_wait_queue_heads[i].wqh); diff -upN reference/fs/dcache.c current/fs/dcache.c --- reference/fs/dcache.c 2004-04-30 11:23:40.000000000 -0700 +++ current/fs/dcache.c 2004-05-01 10:20:57.000000000 -0700 @@ -1562,13 +1562,9 @@ static void __init dcache_init(unsigned * flag could be removed here, to hint to the allocator that * it should not try to get multiple page regions. */ - dentry_cache = kmem_cache_create("dentry_cache", - sizeof(struct dentry), - 0, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, - NULL, NULL); - if (!dentry_cache) - panic("Cannot create dentry cache"); + dentry_cache = kmem_cache_create("dentry_cache", sizeof(struct dentry), + 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_PANIC, + NULL, NULL); set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory); @@ -1633,17 +1629,11 @@ void __init vfs_caches_init(unsigned lon reserve = (mempages - nr_free_pages()) * 3/2; mempages -= reserve; - names_cachep = kmem_cache_create("names_cache", - PATH_MAX, 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!names_cachep) - panic("Cannot create names SLAB cache"); - - filp_cachep = kmem_cache_create("filp", - sizeof(struct file), 0, - SLAB_HWCACHE_ALIGN, filp_ctor, filp_dtor); - if(!filp_cachep) - panic("Cannot create filp SLAB cache"); + names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); + + filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, filp_ctor, filp_dtor); dcache_init(mempages); inode_init(mempages); diff -upN reference/fs/dnotify.c current/fs/dnotify.c --- reference/fs/dnotify.c 2004-04-30 11:23:40.000000000 -0700 +++ current/fs/dnotify.c 2004-05-01 10:20:57.000000000 -0700 @@ -173,9 +173,7 @@ EXPORT_SYMBOL_GPL(dnotify_parent); static int __init dnotify_init(void) { dn_cache = kmem_cache_create("dnotify_cache", - sizeof(struct dnotify_struct), 0, 0, NULL, NULL); - if (!dn_cache) - panic("cannot create dnotify slab cache"); + sizeof(struct dnotify_struct), 0, SLAB_PANIC, NULL, NULL); return 0; } diff -upN reference/fs/dquot.c current/fs/dquot.c --- reference/fs/dquot.c 2004-04-30 11:23:40.000000000 -0700 +++ current/fs/dquot.c 2004-05-01 10:20:57.000000000 -0700 @@ -1715,9 +1715,8 @@ static int __init dquot_init(void) dquot_cachep = kmem_cache_create("dquot", sizeof(struct dquot), sizeof(unsigned long) * 4, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, NULL, NULL); - if (!dquot_cachep) - panic("Cannot create dquot SLAB cache"); + SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|SLAB_PANIC, + NULL, NULL); order = 0; dquot_hash = (struct hlist_head *)__get_free_pages(GFP_ATOMIC, order); diff -upN reference/fs/eventpoll.c current/fs/eventpoll.c --- reference/fs/eventpoll.c 2004-04-30 11:23:40.000000000 -0700 +++ current/fs/eventpoll.c 2004-05-01 10:20:57.000000000 -0700 @@ -1695,22 +1695,14 @@ static int __init eventpoll_init(void) ep_poll_safewake_init(&psw); /* Allocates slab cache used to allocate "struct epitem" items */ - error = -ENOMEM; - epi_cache = kmem_cache_create("eventpoll_epi", - sizeof(struct epitem), - 0, - SLAB_HWCACHE_ALIGN | EPI_SLAB_DEBUG, NULL, NULL); - if (!epi_cache) - goto eexit_1; + epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem), + 0, SLAB_HWCACHE_ALIGN|EPI_SLAB_DEBUG|SLAB_PANIC, + NULL, NULL); /* Allocates slab cache used to allocate "struct eppoll_entry" */ - error = -ENOMEM; pwq_cache = kmem_cache_create("eventpoll_pwq", - sizeof(struct eppoll_entry), - 0, - EPI_SLAB_DEBUG, NULL, NULL); - if (!pwq_cache) - goto eexit_2; + sizeof(struct eppoll_entry), 0, + EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); /* * Register the virtual file system that will be the source of inodes @@ -1718,27 +1710,20 @@ static int __init eventpoll_init(void) */ error = register_filesystem(&eventpoll_fs_type); if (error) - goto eexit_3; + goto epanic; /* Mount the above commented virtual file system */ eventpoll_mnt = kern_mount(&eventpoll_fs_type); error = PTR_ERR(eventpoll_mnt); if (IS_ERR(eventpoll_mnt)) - goto eexit_4; - - DNPRINTK(3, (KERN_INFO "[%p] eventpoll: successfully initialized.\n", current)); + goto epanic; + DNPRINTK(3, (KERN_INFO "[%p] eventpoll: successfully initialized.\n", + current)); return 0; -eexit_4: - unregister_filesystem(&eventpoll_fs_type); -eexit_3: - kmem_cache_destroy(pwq_cache); -eexit_2: - kmem_cache_destroy(epi_cache); -eexit_1: - - return error; +epanic: + panic("eventpoll_init() failed\n"); } @@ -1755,4 +1740,3 @@ module_init(eventpoll_init); module_exit(eventpoll_exit); MODULE_LICENSE("GPL"); - diff -upN reference/fs/fcntl.c current/fs/fcntl.c --- reference/fs/fcntl.c 2004-04-30 11:23:41.000000000 -0700 +++ current/fs/fcntl.c 2004-05-01 10:20:57.000000000 -0700 @@ -627,15 +627,12 @@ void kill_fasync(struct fasync_struct ** read_unlock(&fasync_lock); } } - EXPORT_SYMBOL(kill_fasync); static int __init fasync_init(void) { fasync_cache = kmem_cache_create("fasync_cache", - sizeof(struct fasync_struct), 0, 0, NULL, NULL); - if (!fasync_cache) - panic("cannot create fasync slab cache"); + sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL, NULL); return 0; } diff -upN reference/fs/inode.c current/fs/inode.c --- reference/fs/inode.c 2004-04-30 11:23:41.000000000 -0700 +++ current/fs/inode.c 2004-05-01 10:20:57.000000000 -0700 @@ -1383,11 +1383,8 @@ void __init inode_init(unsigned long mem /* inode slab cache */ inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode), - 0, SLAB_HWCACHE_ALIGN, init_once, - NULL); - if (!inode_cachep) - panic("cannot create inode slab cache"); - + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, init_once, + NULL); set_shrinker(DEFAULT_SEEKS, shrink_icache_memory); } @@ -1408,5 +1405,4 @@ void init_special_inode(struct inode *in printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode); } - EXPORT_SYMBOL(init_special_inode); diff -upN reference/fs/locks.c current/fs/locks.c --- reference/fs/locks.c 2004-04-30 11:23:42.000000000 -0700 +++ current/fs/locks.c 2004-05-01 10:20:57.000000000 -0700 @@ -1994,15 +1994,13 @@ void steal_locks(fl_owner_t from) } unlock_kernel(); } - EXPORT_SYMBOL(steal_locks); static int __init filelock_init(void) { filelock_cache = kmem_cache_create("file_lock_cache", - sizeof(struct file_lock), 0, 0, init_once, NULL); - if (!filelock_cache) - panic("cannot create file lock slab cache"); + sizeof(struct file_lock), 0, SLAB_PANIC, + init_once, NULL); return 0; } diff -upN reference/fs/namespace.c current/fs/namespace.c --- reference/fs/namespace.c 2004-04-30 11:23:42.000000000 -0700 +++ current/fs/namespace.c 2004-05-01 10:20:57.000000000 -0700 @@ -1142,9 +1142,7 @@ void __init mnt_init(unsigned long mempa int i; mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount), - 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!mnt_cache) - panic("Cannot create vfsmount cache"); + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); order = 0; mount_hashtable = (struct list_head *) diff -upN reference/include/linux/slab.h current/include/linux/slab.h --- reference/include/linux/slab.h 2004-04-30 11:23:54.000000000 -0700 +++ current/include/linux/slab.h 2004-05-01 10:20:57.000000000 -0700 @@ -44,6 +44,7 @@ typedef struct kmem_cache_s kmem_cache_t #define SLAB_STORE_USER 0x00010000UL /* store the last owner for bug hunting */ #define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* track pages allocated to indicate what is reclaimable later*/ +#define SLAB_PANIC 0x00040000UL /* panic if kmem_cache_create() fails */ /* flags passed to a constructor func */ #define SLAB_CTOR_CONSTRUCTOR 0x001UL /* if not set, then deconstructor */ diff -upN reference/kernel/fork.c current/kernel/fork.c --- reference/kernel/fork.c 2004-04-30 11:23:55.000000000 -0700 +++ current/kernel/fork.c 2004-05-01 10:20:57.000000000 -0700 @@ -215,11 +215,8 @@ void __init fork_init(unsigned long memp #endif /* create a slab on which task_structs can be allocated */ task_struct_cachep = - kmem_cache_create("task_struct", - sizeof(struct task_struct),ARCH_MIN_TASKALIGN, - 0, NULL, NULL); - if (!task_struct_cachep) - panic("fork_init(): cannot create task_struct SLAB cache"); + kmem_cache_create("task_struct", sizeof(struct task_struct), + ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL); #endif /* @@ -1227,37 +1224,20 @@ void __init proc_caches_init(void) { sighand_cachep = kmem_cache_create("sighand_cache", sizeof(struct sighand_struct), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!sighand_cachep) - panic("Cannot create sighand SLAB cache"); - + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); signal_cachep = kmem_cache_create("signal_cache", sizeof(struct signal_struct), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!signal_cachep) - panic("Cannot create signal SLAB cache"); - + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); files_cachep = kmem_cache_create("files_cache", - sizeof(struct files_struct), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!files_cachep) - panic("Cannot create files SLAB cache"); - + sizeof(struct files_struct), 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); fs_cachep = kmem_cache_create("fs_cache", - sizeof(struct fs_struct), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if (!fs_cachep) - panic("Cannot create fs_struct SLAB cache"); - + sizeof(struct fs_struct), 0, + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); vm_area_cachep = kmem_cache_create("vm_area_struct", sizeof(struct vm_area_struct), 0, - 0, NULL, NULL); - if(!vm_area_cachep) - panic("vma_init: Cannot alloc vm_area_struct SLAB cache"); - + SLAB_PANIC, NULL, NULL); mm_cachep = kmem_cache_create("mm_struct", sizeof(struct mm_struct), 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if(!mm_cachep) - panic("vma_init: Cannot alloc mm_struct SLAB cache"); + SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); } diff -upN reference/kernel/signal.c current/kernel/signal.c --- reference/kernel/signal.c 2004-04-30 11:23:56.000000000 -0700 +++ current/kernel/signal.c 2004-05-01 10:20:57.000000000 -0700 @@ -2568,7 +2568,5 @@ void __init signals_init(void) kmem_cache_create("sigqueue", sizeof(struct sigqueue), __alignof__(struct sigqueue), - 0, NULL, NULL); - if (!sigqueue_cachep) - panic("signals_init(): cannot create sigqueue SLAB cache"); + SLAB_PANIC, NULL, NULL); } diff -upN reference/kernel/user.c current/kernel/user.c --- reference/kernel/user.c 2003-10-01 11:35:36.000000000 -0700 +++ current/kernel/user.c 2004-05-01 10:20:57.000000000 -0700 @@ -138,10 +138,7 @@ static int __init uid_cache_init(void) int n; uid_cachep = kmem_cache_create("uid_cache", sizeof(struct user_struct), - 0, - SLAB_HWCACHE_ALIGN, NULL, NULL); - if(!uid_cachep) - panic("Cannot create uid taskcount SLAB cache\n"); + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL); for(n = 0; n < UIDHASH_SZ; ++n) INIT_LIST_HEAD(uidhash_table + n); diff -upN reference/lib/radix-tree.c current/lib/radix-tree.c --- reference/lib/radix-tree.c 2004-04-30 11:23:56.000000000 -0700 +++ current/lib/radix-tree.c 2004-05-01 10:20:57.000000000 -0700 @@ -799,9 +799,7 @@ void __init radix_tree_init(void) { radix_tree_node_cachep = kmem_cache_create("radix_tree_node", sizeof(struct radix_tree_node), 0, - 0, radix_tree_node_ctor, NULL); - if (!radix_tree_node_cachep) - panic ("Failed to create radix_tree_node cache\n"); + SLAB_PANIC, radix_tree_node_ctor, NULL); radix_tree_init_maxindex(); hotcpu_notifier(radix_tree_callback, 0); } diff -upN reference/mm/rmap.c current/mm/rmap.c --- reference/mm/rmap.c 2004-05-01 10:20:57.000000000 -0700 +++ current/mm/rmap.c 2004-05-01 10:20:57.000000000 -0700 @@ -962,10 +962,7 @@ void __init pte_chain_init(void) pte_chain_cache = kmem_cache_create( "pte_chain", sizeof(struct pte_chain), sizeof(struct pte_chain), - 0, + SLAB_PANIC, pte_chain_ctor, NULL); - - if (!pte_chain_cache) - panic("failed to create pte_chain cache!\n"); } diff -upN reference/mm/shmem.c current/mm/shmem.c --- reference/mm/shmem.c 2004-04-30 11:23:57.000000000 -0700 +++ current/mm/shmem.c 2004-05-01 10:20:58.000000000 -0700 @@ -1808,9 +1808,9 @@ static void init_once(void *foo, kmem_ca static int init_inodecache(void) { shmem_inode_cachep = kmem_cache_create("shmem_inode_cache", - sizeof(struct shmem_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, - init_once, NULL); + sizeof(struct shmem_inode_info), + 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + init_once, NULL); if (shmem_inode_cachep == NULL) return -ENOMEM; return 0; diff -upN reference/mm/slab.c current/mm/slab.c --- reference/mm/slab.c 2004-04-30 11:23:57.000000000 -0700 +++ current/mm/slab.c 2004-05-01 10:20:58.000000000 -0700 @@ -135,11 +135,11 @@ SLAB_POISON | SLAB_HWCACHE_ALIGN | \ SLAB_NO_REAP | SLAB_CACHE_DMA | \ SLAB_MUST_HWCACHE_ALIGN | SLAB_STORE_USER | \ - SLAB_RECLAIM_ACCOUNT ) + SLAB_RECLAIM_ACCOUNT | SLAB_PANIC) #else # define CREATE_MASK (SLAB_HWCACHE_ALIGN | SLAB_NO_REAP | \ SLAB_CACHE_DMA | SLAB_MUST_HWCACHE_ALIGN | \ - SLAB_RECLAIM_ACCOUNT) + SLAB_RECLAIM_ACCOUNT | SLAB_PANIC) #endif /* @@ -1380,9 +1380,11 @@ next: up(&cache_chain_sem); unlock_cpu_hotplug(); opps: + if (!cachep && (flags & SLAB_PANIC)) + panic("kmem_cache_create(): failed to create slab `%s'\n", + name); return cachep; } - EXPORT_SYMBOL(kmem_cache_create); static inline void check_irq_off(void) diff -upN reference/net/socket.c current/net/socket.c --- reference/net/socket.c 2004-03-11 14:35:54.000000000 -0800 +++ current/net/socket.c 2004-05-01 10:20:58.000000000 -0700 @@ -308,9 +308,9 @@ static void init_once(void * foo, kmem_c static int init_inodecache(void) { sock_inode_cachep = kmem_cache_create("sock_inode_cache", - sizeof(struct socket_alloc), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, - init_once, NULL); + sizeof(struct socket_alloc), + 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + init_once, NULL); if (sock_inode_cachep == NULL) return -ENOMEM; return 0;