From 018d4d9d3cb6bf0cf7a7564582a0e9e9e5146a83 Mon Sep 17 00:00:00 2001 From: Eduard - Gabriel Munteanu Date: Fri, 25 Jul 2008 19:45:11 -0700 Subject: [PATCH] --- yaml --- r: 106168 b: refs/heads/master c: c2147a5092cfe13dbf3210e54e8a622015edeecc h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/asm-generic/vmlinux.lds.h | 2 ++ trunk/include/linux/init.h | 7 +++++++ trunk/init/main.c | 13 +++++++++++-- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index c22f034e4ad1..d133cb58c359 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 89081d17f7bb81d89fa1aa9b70f821c5cf4d39e9 +refs/heads/master: c2147a5092cfe13dbf3210e54e8a622015edeecc diff --git a/trunk/include/asm-generic/vmlinux.lds.h b/trunk/include/asm-generic/vmlinux.lds.h index 729f6b0a60e9..9cd44b162ba1 100644 --- a/trunk/include/asm-generic/vmlinux.lds.h +++ b/trunk/include/asm-generic/vmlinux.lds.h @@ -359,6 +359,8 @@ } #define INITCALLS \ + *(.initcallearly.init) \ + __early_initcall_end = .; \ *(.initcall0.init) \ *(.initcall0s.init) \ *(.initcall1.init) \ diff --git a/trunk/include/linux/init.h b/trunk/include/linux/init.h index 42ae95411a93..11b84e106053 100644 --- a/trunk/include/linux/init.h +++ b/trunk/include/linux/init.h @@ -169,6 +169,13 @@ extern void (*late_time_init)(void); static initcall_t __initcall_##fn##id __used \ __attribute__((__section__(".initcall" level ".init"))) = fn +/* + * Early initcalls run before initializing SMP. + * + * Only for built-in code, not modules. + */ +#define early_initcall(fn) __define_initcall("early",fn,early) + /* * A "pure" initcall has no dependencies on anything else, and purely * initializes variables that couldn't be statically initialized. diff --git a/trunk/init/main.c b/trunk/init/main.c index 0604cbcaf1e4..b6fec08dbbef 100644 --- a/trunk/init/main.c +++ b/trunk/init/main.c @@ -743,13 +743,13 @@ static void __init do_one_initcall(initcall_t fn) } -extern initcall_t __initcall_start[], __initcall_end[]; +extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; static void __init do_initcalls(void) { initcall_t *call; - for (call = __initcall_start; call < __initcall_end; call++) + for (call = __early_initcall_end; call < __initcall_end; call++) do_one_initcall(*call); /* Make sure there is no pending stuff from the initcall sequence */ @@ -783,6 +783,14 @@ static int __init nosoftlockup_setup(char *str) } __setup("nosoftlockup", nosoftlockup_setup); +static void __init __do_pre_smp_initcalls(void) +{ + initcall_t *call; + + for (call = __initcall_start; call < __early_initcall_end; call++) + do_one_initcall(*call); +} + static void __init do_pre_smp_initcalls(void) { extern int spawn_ksoftirqd(void); @@ -865,6 +873,7 @@ static int __init kernel_init(void * unused) smp_prepare_cpus(setup_max_cpus); + __do_pre_smp_initcalls(); do_pre_smp_initcalls(); smp_init();