alpha, smpboot: Use generic SMP booting infrastructure

Started by Srivatsa S. Bhat on Jun 1, 2012

Subsystems (2)

Maintainers (4)

DORMANTno replies

open the first message on its own page

Message details and related content
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 <redacted>
Cc: Ivan Kokshaysky <redacted>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Thomas Gleixner <redacted>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Eric Dumazet <redacted>
Cc: Rusty Russell <redacted>
Cc: Mike Frysinger <redacted>
Cc: <redacted>
Signed-off-by: Srivatsa S. Bhat <redacted>
---

 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.  */
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help