summaryrefslogtreecommitdiff
path: root/lib/idr.c
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2008-04-29 01:03:13 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 08:06:25 -0700
commit199f0ca514f9c17668eec4f935c4ba24cd789f85 (patch)
tree54406e3eb5be58e3350d8f60a64ac78ec3990f97 /lib/idr.c
parent801678c5a3b4c79236970bcca27c733f5559e0d1 (diff)
downloadlinux-3.10-199f0ca514f9c17668eec4f935c4ba24cd789f85.tar.gz
linux-3.10-199f0ca514f9c17668eec4f935c4ba24cd789f85.tar.bz2
linux-3.10-199f0ca514f9c17668eec4f935c4ba24cd789f85.zip
idr: create idr_layer_cache at boot time
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. [akpm@linux-foundation.org: rename init_id_cache() to idr_init_cache()] [akpm@linux-foundation.org: fix alpha build] Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/idr.c')
-rw-r--r--lib/idr.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/lib/idr.c b/lib/idr.c
index afbb0b1023d..8368c81fcb7 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -585,12 +585,11 @@ static void idr_cache_ctor(struct kmem_cache *idr_layer_cache, void *idr_layer)
memset(idr_layer, 0, sizeof(struct idr_layer));
}
-static int init_id_cache(void)
+void __init idr_init_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);
}