aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2008-04-29 04:03:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 11:06:25 -0400
commit199f0ca514f9c17668eec4f935c4ba24cd789f85 (patch)
tree54406e3eb5be58e3350d8f60a64ac78ec3990f97
parent801678c5a3b4c79236970bcca27c733f5559e0d1 (diff)
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>
-rw-r--r--include/linux/idr.h3
-rw-r--r--init/main.c2
-rw-r--r--lib/idr.c10
3 files changed, 9 insertions, 6 deletions
diff --git a/include/linux/idr.h b/include/linux/idr.h
index 0edda411959c..9a2d762124de 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -14,6 +14,7 @@
14 14
15#include <linux/types.h> 15#include <linux/types.h>
16#include <linux/bitops.h> 16#include <linux/bitops.h>
17#include <linux/init.h>
17 18
18#if BITS_PER_LONG == 32 19#if BITS_PER_LONG == 32
19# define IDR_BITS 5 20# define IDR_BITS 5
@@ -115,4 +116,6 @@ void ida_remove(struct ida *ida, int id);
115void ida_destroy(struct ida *ida); 116void ida_destroy(struct ida *ida);
116void ida_init(struct ida *ida); 117void ida_init(struct ida *ida);
117 118
119void __init idr_init_cache(void);
120
118#endif /* __IDR_H__ */ 121#endif /* __IDR_H__ */
diff --git a/init/main.c b/init/main.c
index c62c98f381f2..624266b524d4 100644
--- a/init/main.c
+++ b/init/main.c
@@ -58,6 +58,7 @@
58#include <linux/kthread.h> 58#include <linux/kthread.h>
59#include <linux/sched.h> 59#include <linux/sched.h>
60#include <linux/signal.h> 60#include <linux/signal.h>
61#include <linux/idr.h>
61 62
62#include <asm/io.h> 63#include <asm/io.h>
63#include <asm/bugs.h> 64#include <asm/bugs.h>
@@ -637,6 +638,7 @@ asmlinkage void __init start_kernel(void)
637 enable_debug_pagealloc(); 638 enable_debug_pagealloc();
638 cpu_hotplug_init(); 639 cpu_hotplug_init();
639 kmem_cache_init(); 640 kmem_cache_init();
641 idr_init_cache();
640 setup_per_cpu_pageset(); 642 setup_per_cpu_pageset();
641 numa_policy_init(); 643 numa_policy_init();
642 if (late_time_init) 644 if (late_time_init)
diff --git a/lib/idr.c b/lib/idr.c
index afbb0b1023d4..8368c81fcb7d 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)
585 memset(idr_layer, 0, sizeof(struct idr_layer)); 585 memset(idr_layer, 0, sizeof(struct idr_layer));
586} 586}
587 587
588static int init_id_cache(void) 588void __init idr_init_cache(void)
589{ 589{
590 if (!idr_layer_cache) 590 idr_layer_cache = kmem_cache_create("idr_layer_cache",
591 idr_layer_cache = kmem_cache_create("idr_layer_cache", 591 sizeof(struct idr_layer), 0, SLAB_PANIC,
592 sizeof(struct idr_layer), 0, 0, idr_cache_ctor); 592 idr_cache_ctor);
593 return 0;
594} 593}
595 594
596/** 595/**
@@ -602,7 +601,6 @@ static int init_id_cache(void)
602 */ 601 */
603void idr_init(struct idr *idp) 602void idr_init(struct idr *idp)
604{ 603{
605 init_id_cache();
606 memset(idp, 0, sizeof(struct idr)); 604 memset(idp, 0, sizeof(struct idr));
607 spin_lock_init(&idp->lock); 605 spin_lock_init(&idp->lock);
608} 606}