Convert alpha to use the generic framework to boot secondary CPUs. Notes: 1. The secondary cpu was being set in the cpu_online_mask way too early. Postpone it. 2. The original code was enabling interrupts before calling wait_boot_cpu_to_stop(). Instead postpone the enabling of interrupts to after the cpu_online_mask is set. Cc: Richard Henderson <rth@xxxxxxxxxxx> Cc: Ivan Kokshaysky <ink@xxxxxxxxxxxxxxxxxxxx> Cc: Matt Turner <mattst88@xxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Eric Dumazet <eric.dumazet@xxxxxxxxx> Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxx> Cc: Mike Frysinger <vapier@xxxxxxxxxx> Cc: linux-alpha@xxxxxxxxxxxxxxx Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> --- arch/alpha/kernel/smp.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c index 35ddc02..2547431 100644 --- a/arch/alpha/kernel/smp.c +++ b/arch/alpha/kernel/smp.c @@ -28,6 +28,7 @@ #include <linux/profile.h> #include <linux/bitops.h> #include <linux/cpu.h> +#include <linux/smpboot.h> #include <asm/hwrpb.h> #include <asm/ptrace.h> @@ -119,13 +120,17 @@ wait_boot_cpu_to_stop(int cpuid) void __cpuinit smp_callin(void) { - int cpuid = hard_smp_processor_id(); + smpboot_start_secondary(NULL); +} + +void __cpuinit __cpu_pre_starting(void *unused) +{ + unsigned int cpuid = hard_smp_processor_id(); if (cpu_online(cpuid)) { printk("??, cpu 0x%x already present??\n", cpuid); BUG(); } - set_cpu_online(cpuid, true); /* Turn on machine checks. */ wrmces(7); @@ -145,15 +150,16 @@ smp_callin(void) /* All kernel threads share the same mm context. */ atomic_inc(&init_mm.mm_count); current->active_mm = &init_mm; +} - /* inform the notifiers about the new cpu */ - notify_cpu_starting(cpuid); - - /* Must have completely accurate bogos. */ - local_irq_enable(); +void __cpuinit __cpu_pre_online(void *unused) +{ + unsigned int cpuid = hard_smp_processor_id(); - /* Wait boot CPU to stop with irq enabled before running - calibrate_delay. */ + /* + * Wait boot CPU to stop with irq disabled before running + * calibrate_delay. + */ wait_boot_cpu_to_stop(cpuid); mb(); calibrate_delay(); @@ -165,9 +171,6 @@ smp_callin(void) DBGS(("smp_callin: commencing CPU %d current %p active_mm %p\n", cpuid, current, current->active_mm)); - - /* Do nothing. */ - cpu_idle(); } /* Wait until hwrpb->txrdy is clear for cpu. Return -1 on timeout. */ -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html