From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Srivatsa S. Bhat" Subject: [PATCH 27/27] alpha, smpboot: Use generic SMP booting infrastructure Date: Fri, 01 Jun 2012 14:46:30 +0530 Message-ID: <20120601091625.31979.49911.stgit@srivatsabhat.in.ibm.com> References: <20120601090952.31979.24799.stgit@srivatsabhat.in.ibm.com> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20120601090952.31979.24799.stgit@srivatsabhat.in.ibm.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: Content-Type: text/plain; charset="us-ascii" To: tglx@linutronix.de, peterz@infradead.org, paulmck@linux.vnet.ibm.com Cc: rusty@rustcorp.com.au, mingo@kernel.org, yong.zhang0@gmail.com, akpm@linux-foundation.org, vatsa@linux.vnet.ibm.com, rjw@sisk.pl, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, srivatsa.bhat@linux.vnet.ibm.com, nikunj@linux.vnet.ibm.com, Richard Henderson , Ivan Kokshaysky , Matt Turner , Thomas Gleixner , Andrew Morton , Eric Dumazet , Rusty Russell , Mike Frysinger , linux-alpha@vger.kernel.org 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 Cc: Ivan Kokshaysky Cc: Matt Turner Cc: Thomas Gleixner Cc: Andrew Morton Cc: Eric Dumazet Cc: Rusty Russell Cc: Mike Frysinger Cc: linux-alpha@vger.kernel.org Signed-off-by: Srivatsa S. Bhat --- 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 #include #include +#include #include #include @@ -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. */