diff options
| author | Akinobu Mita <akinobu.mita@gmail.com> | 2008-04-29 04:03:13 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:25 -0400 |
| commit | 199f0ca514f9c17668eec4f935c4ba24cd789f85 (patch) | |
| tree | 54406e3eb5be58e3350d8f60a64ac78ec3990f97 | |
| parent | 801678c5a3b4c79236970bcca27c733f5559e0d1 (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.h | 3 | ||||
| -rw-r--r-- | init/main.c | 2 | ||||
| -rw-r--r-- | lib/idr.c | 10 |
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); | |||
| 115 | void ida_destroy(struct ida *ida); | 116 | void ida_destroy(struct ida *ida); |
| 116 | void ida_init(struct ida *ida); | 117 | void ida_init(struct ida *ida); |
| 117 | 118 | ||
| 119 | void __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) |
| @@ -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 | ||
| 588 | static int init_id_cache(void) | 588 | void __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 | */ |
| 603 | void idr_init(struct idr *idp) | 602 | void 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 | } |
