Convert parisc 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 when things aren't initialized fully yet. Postpone that. Cc: "James E.J. Bottomley" <jejb@xxxxxxxxxxxxxxxx> Cc: Helge Deller <deller@xxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Rusty Russell <rusty@xxxxxxxxxxxxxxx> Cc: Mike Frysinger <vapier@xxxxxxxxxx> Cc: David Howells <dhowells@xxxxxxxxxx> Cc: linux-parisc@xxxxxxxxxxxxxxx Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> --- arch/parisc/kernel/smp.c | 30 ++++++++++++++---------------- 1 files changed, 14 insertions(+), 16 deletions(-) diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 6266730..a6199e2 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -32,6 +32,7 @@ #include <linux/bitops.h> #include <linux/ftrace.h> #include <linux/cpu.h> +#include <linux/smpboot.h> #include <linux/atomic.h> #include <asm/current.h> @@ -280,8 +281,6 @@ static void __init smp_cpu_init(int cpunum) { extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */ - extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */ - extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */ /* Set modes and Enable floating point coprocessor */ (void) init_per_cpu(cpunum); @@ -297,10 +296,12 @@ smp_cpu_init(int cpunum) printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); machine_halt(); } +} - notify_cpu_starting(cpunum); - - set_cpu_online(cpunum, true); +void __cpuinit __cpu_pre_online(void *unused) +{ + extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */ + extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */ /* Initialise the idle task for this CPU */ atomic_inc(&init_mm.mm_count); @@ -310,6 +311,9 @@ smp_cpu_init(int cpunum) init_IRQ(); /* make sure no IRQs are enabled or pending */ start_cpu_itimer(); + + flush_cache_all_local(); /* start with known state */ + flush_tlb_all_local(NULL); } @@ -319,20 +323,14 @@ smp_cpu_init(int cpunum) */ void __init smp_callin(void) { + smpboot_start_secondary(NULL); +} + +void __cpuinit __cpu_pre_starting(void *unused) +{ int slave_id = cpu_now_booting; smp_cpu_init(slave_id); - preempt_disable(); - - flush_cache_all_local(); /* start with known state */ - flush_tlb_all_local(NULL); - - local_irq_enable(); /* Interrupts have been off until now */ - - cpu_idle(); /* Wait for timer to schedule some work */ - - /* NOTREACHED */ - panic("smp_callin() AAAAaaaaahhhh....\n"); } /* -- 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