From: Akinobu Mita Avoid a possible kmem_cache_create() failure by creating idr_layer_cache unconditionary at boot time rather than creating it on-demand when idr_init() is called the first time. This change also enables us to eliminate the check every time idr_init() is called. Signed-off-by: Akinobu Mita Signed-off-by: Andrew Morton --- include/linux/idr.h | 2 ++ init/main.c | 2 ++ lib/idr.c | 10 ++++------ 3 files changed, 8 insertions(+), 6 deletions(-) diff -puN include/linux/idr.h~idr-create-idr_layer_cache-at-boot-time include/linux/idr.h --- a/include/linux/idr.h~idr-create-idr_layer_cache-at-boot-time +++ a/include/linux/idr.h @@ -115,4 +115,6 @@ void ida_remove(struct ida *ida, int id) void ida_destroy(struct ida *ida); void ida_init(struct ida *ida); +void __init init_id_cache(void); + #endif /* __IDR_H__ */ diff -puN init/main.c~idr-create-idr_layer_cache-at-boot-time init/main.c --- a/init/main.c~idr-create-idr_layer_cache-at-boot-time +++ a/init/main.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include @@ -610,6 +611,7 @@ asmlinkage void __init start_kernel(void enable_debug_pagealloc(); cpu_hotplug_init(); kmem_cache_init(); + init_id_cache(); setup_per_cpu_pageset(); numa_policy_init(); if (late_time_init) diff -puN lib/idr.c~idr-create-idr_layer_cache-at-boot-time lib/idr.c --- a/lib/idr.c~idr-create-idr_layer_cache-at-boot-time +++ a/lib/idr.c @@ -585,12 +585,11 @@ static void idr_cache_ctor(struct kmem_c memset(idr_layer, 0, sizeof(struct idr_layer)); } -static int init_id_cache(void) +void __init init_id_cache(void) { - if (!idr_layer_cache) - idr_layer_cache = kmem_cache_create("idr_layer_cache", - sizeof(struct idr_layer), 0, 0, idr_cache_ctor); - return 0; + idr_layer_cache = kmem_cache_create("idr_layer_cache", + sizeof(struct idr_layer), 0, SLAB_PANIC, + idr_cache_ctor); } /** @@ -602,7 +601,6 @@ static int init_id_cache(void) */ void idr_init(struct idr *idp) { - init_id_cache(); memset(idp, 0, sizeof(struct idr)); spin_lock_init(&idp->lock); } _