x86/smp: Fix cpuN startup panic
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
@@ -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
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/0x252During 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.
Signed-off-by Yanmin Zhang <[email protected]>Signed-off-by Lin Chen <[email protected]>--- arch/x86/kernel/smpboot.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)arch/x86/kernel/smpboot.c +0
-0
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
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/0x252During 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.
Signed-off-by Yanmin Zhang <[email protected]>Signed-off-by Lin Chen <[email protected]>--- arch/x86/kernel/smpboot.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)arch/x86/kernel/smpboot.c +0
-0arch/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!
GerryQuoted 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