63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
From: Len Brown <len.brown@intel.com>
|
|
Date: Fri, 16 Oct 2015 00:14:29 -0400
|
|
Subject: x86/smpboot: Fix CPU #1 boot timeout
|
|
Origin: https://git.kernel.org/linus/fcafddec4e78a7776db4b6685db6b2902d4300fc
|
|
Bug-Debian: https://bugs.debian.org/802464
|
|
|
|
The following commit:
|
|
|
|
a9bcaa02a5104ac ("x86/smpboot: Remove SIPI delays from cpu_up()")
|
|
|
|
Caused some Intel Core2 processors to time-out when bringing up CPU #1,
|
|
resulting in the missing of that CPU after bootup.
|
|
|
|
That patch reduced the SIPI delays from udelay() 300, 200 to udelay() 0,
|
|
0 on modern processors.
|
|
|
|
Several Intel(R) Core(TM)2 systems failed to bring up CPU #1 10/10 times
|
|
after that change.
|
|
|
|
Increasing either of the SIPI delays to udelay(1) results in
|
|
success. So here we increase both to udelay(10). While this may
|
|
be 20x slower than the absolute minimum, it is still 20x to 30x
|
|
faster than the original code.
|
|
|
|
Tested-by: Donald Parsons <dparsons@brightdsl.net>
|
|
Tested-by: Shane <shrybman@teksavvy.com>
|
|
Signed-off-by: Len Brown <len.brown@intel.com>
|
|
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
Cc: Thomas Gleixner <tglx@linutronix.de>
|
|
Cc: dparsons@brightdsl.net
|
|
Cc: shrybman@teksavvy.com
|
|
Link: http://lkml.kernel.org/r/6dd554ee8945984d85aafb2ad35793174d068af0.1444968087.git.len.brown@intel.com
|
|
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|
---
|
|
arch/x86/kernel/smpboot.c | 8 ++++++--
|
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
|
|
--- a/arch/x86/kernel/smpboot.c
|
|
+++ b/arch/x86/kernel/smpboot.c
|
|
@@ -657,7 +657,9 @@ wakeup_secondary_cpu_via_init(int phys_a
|
|
/*
|
|
* Give the other CPU some time to accept the IPI.
|
|
*/
|
|
- if (init_udelay)
|
|
+ if (init_udelay == 0)
|
|
+ udelay(10);
|
|
+ else
|
|
udelay(300);
|
|
|
|
pr_debug("Startup point 1\n");
|
|
@@ -668,7 +670,9 @@ wakeup_secondary_cpu_via_init(int phys_a
|
|
/*
|
|
* Give the other CPU some time to accept the IPI.
|
|
*/
|
|
- if (init_udelay)
|
|
+ if (init_udelay == 0)
|
|
+ udelay(10);
|
|
+ else
|
|
udelay(200);
|
|
|
|
if (maxlvt > 3) /* Due to the Pentium erratum 3AP. */
|