From: Eduard - Gabriel Munteanu A previous patch added the early_initcall(), to allow a cleaner hooking of pre-SMP initcalls. Now we remove the older interface, converting all existing users to the new one. Signed-off-by: Eduard - Gabriel Munteanu Cc: Tom Zanussi Signed-off-by: Andrew Morton --- include/linux/sched.h | 9 --------- init/main.c | 22 +--------------------- kernel/sched.c | 6 +++++- kernel/softirq.c | 4 +++- kernel/softlockup.c | 27 ++++++++++++++++++++++++--- 5 files changed, 33 insertions(+), 35 deletions(-) diff -puN include/linux/sched.h~full-conversion-to-early_initcall-interface-remove-old-interface include/linux/sched.h --- a/include/linux/sched.h~full-conversion-to-early_initcall-interface-remove-old-interface +++ a/include/linux/sched.h @@ -292,7 +292,6 @@ extern void sched_show_task(struct task_ #ifdef CONFIG_DETECT_SOFTLOCKUP extern void softlockup_tick(void); -extern void spawn_softlockup_task(void); extern void touch_softlockup_watchdog(void); extern void touch_all_softlockup_watchdogs(void); extern unsigned int softlockup_panic; @@ -2221,14 +2220,6 @@ static inline void inc_syscw(struct task } #endif -#ifdef CONFIG_SMP -void migration_init(void); -#else -static inline void migration_init(void) -{ -} -#endif - #ifndef TASK_SIZE_OF #define TASK_SIZE_OF(tsk) TASK_SIZE #endif diff -puN include/linux/smp.h~full-conversion-to-early_initcall-interface-remove-old-interface include/linux/smp.h diff -puN init/main.c~full-conversion-to-early_initcall-interface-remove-old-interface init/main.c --- a/init/main.c~full-conversion-to-early_initcall-interface-remove-old-interface +++ a/init/main.c @@ -773,16 +773,7 @@ static void __init do_basic_setup(void) do_initcalls(); } -static int __initdata nosoftlockup; - -static int __init nosoftlockup_setup(char *str) -{ - nosoftlockup = 1; - return 1; -} -__setup("nosoftlockup", nosoftlockup_setup); - -static void __init __do_pre_smp_initcalls(void) +static void __init do_pre_smp_initcalls(void) { initcall_t *call; @@ -790,16 +781,6 @@ static void __init __do_pre_smp_initcall do_one_initcall(*call); } -static void __init do_pre_smp_initcalls(void) -{ - extern int spawn_ksoftirqd(void); - - migration_init(); - spawn_ksoftirqd(); - if (!nosoftlockup) - spawn_softlockup_task(); -} - static void run_init_process(char *init_filename) { argv_init[0] = init_filename; @@ -880,7 +861,6 @@ static int __init kernel_init(void * unu smp_prepare_cpus(setup_max_cpus); - __do_pre_smp_initcalls(); do_pre_smp_initcalls(); smp_init(); diff -puN kernel/sched.c~full-conversion-to-early_initcall-interface-remove-old-interface kernel/sched.c --- a/kernel/sched.c~full-conversion-to-early_initcall-interface-remove-old-interface +++ a/kernel/sched.c @@ -6446,7 +6446,7 @@ static struct notifier_block __cpuinitda .priority = 10 }; -void __init migration_init(void) +static int __init migration_init(void) { void *cpu = (void *)(long)smp_processor_id(); int err; @@ -6456,7 +6456,11 @@ void __init migration_init(void) BUG_ON(err == NOTIFY_BAD); migration_call(&migration_notifier, CPU_ONLINE, cpu); register_cpu_notifier(&migration_notifier); + + return err; } + +early_initcall(migration_init); #endif #ifdef CONFIG_SMP diff -puN /dev/null /dev/null diff -puN kernel/softirq.c~full-conversion-to-early_initcall-interface-remove-old-interface kernel/softirq.c --- a/kernel/softirq.c~full-conversion-to-early_initcall-interface-remove-old-interface +++ a/kernel/softirq.c @@ -630,7 +630,7 @@ static struct notifier_block __cpuinitda .notifier_call = cpu_callback }; -__init int spawn_ksoftirqd(void) +static __init int spawn_ksoftirqd(void) { void *cpu = (void *)(long)smp_processor_id(); int err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu); @@ -641,6 +641,8 @@ __init int spawn_ksoftirqd(void) return 0; } +early_initcall(spawn_ksoftirqd); + #ifdef CONFIG_SMP /* * Call a function on all processors diff -puN kernel/softlockup.c~full-conversion-to-early_initcall-interface-remove-old-interface kernel/softlockup.c --- a/kernel/softlockup.c~full-conversion-to-early_initcall-interface-remove-old-interface +++ a/kernel/softlockup.c @@ -338,14 +338,35 @@ static struct notifier_block __cpuinitda .notifier_call = cpu_callback }; -__init void spawn_softlockup_task(void) +static int __initdata nosoftlockup; + +static int __init nosoftlockup_setup(char *str) +{ + nosoftlockup = 1; + return 1; +} +__setup("nosoftlockup", nosoftlockup_setup); + +static int __init spawn_softlockup_task(void) { void *cpu = (void *)(long)smp_processor_id(); - int err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu); + int err; - BUG_ON(err == NOTIFY_BAD); + if (nosoftlockup) + return 0; + + err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu); + if (err == NOTIFY_BAD) { + BUG(); + return 1; + } cpu_callback(&cpu_nfb, CPU_ONLINE, cpu); register_cpu_notifier(&cpu_nfb); atomic_notifier_chain_register(&panic_notifier_list, &panic_block); + + return 0; } + +early_initcall(spawn_softlockup_task); + _