Skip to contentSkip to conversation

x86/smp: Fix cpuN startup panic

PATCH Superseded Chen, LinX Z 3 participants 3 messages Aug 7, 2012 x86

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 x86/smp: Fix cpuN startup panic

From: Lin Chen <[email protected]>

We hit a panic while doing cpu hotplug test.

<0>[  627.982857] Kernel panic - not syncing: smp_callin: CPU1 started up but did not get a callout!
<0>[  627.982864]
<4>[  627.982876] Pid: 0, comm: kworker/0:1 Tainted: G ...
<4>[  627.982883] Call Trace:
<4>[  627.982903]  [<c18f2977>] panic+0x66/0x16c
<4>[  627.982918]  [<c12234cc>] ? default_get_apic_id+0x1c/0x40
<4>[  627.982931]  [<c18ef96d>] start_secondary+0xda/0x252

During BSP bootup AP, it is possible that BSP be preempted before finishing STARTUP sequence of AP(set cpu_callout_mask) which maybe cause AP busy wait for it. At present, AP will wait for 2 seconds then panic.

This patch let AP waits until BSP finish the startup sequence and gives WARNING when BSP is preempted more than 2 seconds.

---
 arch/x86/kernel/smpboot.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
arch/x86/kernel/smpboot.c +6 -5
index 7c5a8c3..a9e3379 100644
@@ -165,19 +165,20 @@ static void __cpuinit smp_callin(void)
 	 * Waiting 2s total for startup (udelay is not yet working)
 	 */
 	timeout = jiffies + 2*HZ;
-	while (time_before(jiffies, timeout)) {
+	while (1) {
 		/*
 		 * Has the boot CPU finished it's STARTUP sequence?
 		 */
 		if (cpumask_test_cpu(cpuid, cpu_callout_mask))
 			break;
 		cpu_relax();
+		if (!time_before(jiffies, timeout)) {
+			WARN(1, "%s: CPU%d started up but did not get a callout!\n",
+					__func__, cpuid);
+			timeout = jiffies + 2*HZ;
+		}
 	}
 
-	if (!time_before(jiffies, timeout)) {
-		panic("%s: CPU%d started up but did not get a callout!\n",
-		      __func__, cpuid);
-	}
 
 	/*
 	 * the boot CPU has finished the init stage and is spinning
Signature · 1 line
1.7.1
#1 lore raw
Quoted 29 lines · LinX Z

From: Lin Chen <[email protected]>

We hit a panic while doing cpu hotplug test.

<0>[  627.982857] Kernel panic - not syncing: smp_callin: CPU1 started up but did not get a callout!
<0>[  627.982864]
<4>[  627.982876] Pid: 0, comm: kworker/0:1 Tainted: G ...
<4>[  627.982883] Call Trace:
<4>[  627.982903]  [<c18f2977>] panic+0x66/0x16c
<4>[  627.982918]  [<c12234cc>] ? default_get_apic_id+0x1c/0x40
<4>[  627.982931]  [<c18ef96d>] start_secondary+0xda/0x252

During BSP bootup AP, it is possible that BSP be preempted before finishing STARTUP sequence of AP(set cpu_callout_mask) which maybe cause AP busy wait for it. At present, AP will wait for 2 seconds then panic.

This patch let AP waits until BSP finish the startup sequence and gives WARNING when BSP is preempted more than 2 seconds.

---
 arch/x86/kernel/smpboot.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
arch/x86/kernel/smpboot.c +0 -0
index 7c5a8c3..a9e3379 100644

arch/x86/kernel/smpboot.c static void __cpuinit smp_callin(void) · line 168

Quoted 5 lines
arch/x86/kernel/smpboot.c +1 -1
@@ -165,19 +165,20 @@ static void __cpuinit smp_callin(void)
      * Waiting 2s total for startup (udelay is not yet working)
      */
     timeout = jiffies + 2*HZ;
-    while (time_before(jiffies, timeout)) {
+    while (1) {

Hi Yanmin,

Seems a little risky, what if a slave CPU can't be booted due to hardware errors? Regards!
Gerry

Quoted 20 lines
arch/x86/kernel/smpboot.c +5 -4
         /*
          * Has the boot CPU finished it's STARTUP sequence?
          */
         if (cpumask_test_cpu(cpuid, cpu_callout_mask))
             break;
         cpu_relax();
+        if (!time_before(jiffies, timeout)) {
+            WARN(1, "%s: CPU%d started up but did not get a callout!\n",
+                    __func__, cpuid);
+            timeout = jiffies + 2*HZ;
+        }
     }
 
-    if (!time_before(jiffies, timeout)) {
-        panic("%s: CPU%d started up but did not get a callout!\n",
-              __func__, cpuid);
-    }
 
     /*
      * the boot CPU has finished the init stage and is spinning
#2 lore raw
Quoted 37 lines · Jiang Liu
Quoted 29 lines · LinX Z

From: Lin Chen <[email protected]>

We hit a panic while doing cpu hotplug test.

<0>[  627.982857] Kernel panic - not syncing: smp_callin: CPU1 started up but did not get a callout!
<0>[  627.982864]
<4>[  627.982876] Pid: 0, comm: kworker/0:1 Tainted: G ...
<4>[  627.982883] Call Trace:
<4>[  627.982903]  [<c18f2977>] panic+0x66/0x16c
<4>[  627.982918]  [<c12234cc>] ? default_get_apic_id+0x1c/0x40
<4>[  627.982931]  [<c18ef96d>] start_secondary+0xda/0x252

During BSP bootup AP, it is possible that BSP be preempted before finishing STARTUP sequence of AP(set cpu_callout_mask) which maybe cause AP busy wait for it. At present, AP will wait for 2 seconds then panic.

This patch let AP waits until BSP finish the startup sequence and gives WARNING when BSP is preempted more than 2 seconds.

---
 arch/x86/kernel/smpboot.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
arch/x86/kernel/smpboot.c +0 -0
index 7c5a8c3..a9e3379 100644

arch/x86/kernel/smpboot.c static void __cpuinit smp_callin(void) · line 168

Quoted 5 lines
arch/x86/kernel/smpboot.c +1 -1
@@ -165,19 +165,20 @@ static void __cpuinit smp_callin(void)
      * Waiting 2s total for startup (udelay is not yet working)
      */
     timeout = jiffies + 2*HZ;
-    while (time_before(jiffies, timeout)) {
+    while (1) {

Hi Yanmin,

Quoted 1 line

Seems a little risky, what if a slave CPU can't be booted due to hardware errors?

Slave CPU runs the loop. Basically, there is a handshake between BSP and AP. The patch doesn't change BSP codes. So when slave CPU fails, BSP still goes ahead and kernel still works.

Quoted 24 lines

Regards!
Gerry

Quoted 20 lines
arch/x86/kernel/smpboot.c +5 -4
         /*
          * Has the boot CPU finished it's STARTUP sequence?
          */
         if (cpumask_test_cpu(cpuid, cpu_callout_mask))
             break;
         cpu_relax();
+        if (!time_before(jiffies, timeout)) {
+            WARN(1, "%s: CPU%d started up but did not get a callout!\n",
+                    __func__, cpuid);
+            timeout = jiffies + 2*HZ;
+        }
     }
 
-    if (!time_before(jiffies, timeout)) {
-        panic("%s: CPU%d started up but did not get a callout!\n",
-              __func__, cpuid);
-    }
 
     /*
      * the boot CPU has finished the init stage and is spinning