aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpu/common.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 13:09:49 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 13:09:49 -0400
commitbb077d600689dbf9305758efed1e16775db1c84c (patch)
tree266abae1925d2c232c42fc0e36628fb8f5940352 /arch/x86/kernel/cpu/common.c
parentc593e8978722f7f4a12932733cfeed6c0c74fbaa (diff)
Revert "x86/smpboot: Initialize secondary CPU only if master CPU will wait for it"
This reverts commit 3e1a878b7ccdb31da6d9d2b855c72ad87afeba3f. It came in very late, and already has one reported failure: Sitsofe reports that the current tree fails to boot on his EeePC, and bisected it down to this. Rather than waste time trying to figure out what's wrong, just revert it. Reported-by: Sitsofe Wheeler <sitsofe@gmail.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Toshi Kani <toshi.kani@hp.com> Cc: Thomas Gleixner <tglx@linutronix.de> Acked-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
-rw-r--r--arch/x86/kernel/cpu/common.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index a4bcbacdbe0b..a135239badb7 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1221,17 +1221,6 @@ static void dbg_restore_debug_regs(void)
1221#define dbg_restore_debug_regs() 1221#define dbg_restore_debug_regs()
1222#endif /* ! CONFIG_KGDB */ 1222#endif /* ! CONFIG_KGDB */
1223 1223
1224static void wait_for_master_cpu(int cpu)
1225{
1226 /*
1227 * wait for ACK from master CPU before continuing
1228 * with AP initialization
1229 */
1230 WARN_ON(cpumask_test_and_set_cpu(cpu, cpu_initialized_mask));
1231 while (!cpumask_test_cpu(cpu, cpu_callout_mask))
1232 cpu_relax();
1233}
1234
1235/* 1224/*
1236 * cpu_init() initializes state that is per-CPU. Some data is already 1225 * cpu_init() initializes state that is per-CPU. Some data is already
1237 * initialized (naturally) in the bootstrap process, such as the GDT 1226 * initialized (naturally) in the bootstrap process, such as the GDT
@@ -1247,17 +1236,16 @@ void cpu_init(void)
1247 struct task_struct *me; 1236 struct task_struct *me;
1248 struct tss_struct *t; 1237 struct tss_struct *t;
1249 unsigned long v; 1238 unsigned long v;
1250 int cpu = stack_smp_processor_id(); 1239 int cpu;
1251 int i; 1240 int i;
1252 1241
1253 wait_for_master_cpu(cpu);
1254
1255 /* 1242 /*
1256 * Load microcode on this cpu if a valid microcode is available. 1243 * Load microcode on this cpu if a valid microcode is available.
1257 * This is early microcode loading procedure. 1244 * This is early microcode loading procedure.
1258 */ 1245 */
1259 load_ucode_ap(); 1246 load_ucode_ap();
1260 1247
1248 cpu = stack_smp_processor_id();
1261 t = &per_cpu(init_tss, cpu); 1249 t = &per_cpu(init_tss, cpu);
1262 oist = &per_cpu(orig_ist, cpu); 1250 oist = &per_cpu(orig_ist, cpu);
1263 1251
@@ -1269,6 +1257,9 @@ void cpu_init(void)
1269 1257
1270 me = current; 1258 me = current;
1271 1259
1260 if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask))
1261 panic("CPU#%d already initialized!\n", cpu);
1262
1272 pr_debug("Initializing CPU#%d\n", cpu); 1263 pr_debug("Initializing CPU#%d\n", cpu);
1273 1264
1274 clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); 1265 clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
@@ -1345,10 +1336,14 @@ void cpu_init(void)
1345 struct tss_struct *t = &per_cpu(init_tss, cpu); 1336 struct tss_struct *t = &per_cpu(init_tss, cpu);
1346 struct thread_struct *thread = &curr->thread; 1337 struct thread_struct *thread = &curr->thread;
1347 1338
1348 wait_for_master_cpu(cpu);
1349
1350 show_ucode_info_early(); 1339 show_ucode_info_early();
1351 1340
1341 if (cpumask_test_and_set_cpu(cpu, cpu_initialized_mask)) {
1342 printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
1343 for (;;)
1344 local_irq_enable();
1345 }
1346
1352 printk(KERN_INFO "Initializing CPU#%d\n", cpu); 1347 printk(KERN_INFO "Initializing CPU#%d\n", cpu);
1353 1348
1354 if (cpu_has_vme || cpu_has_tsc || cpu_has_de) 1349 if (cpu_has_vme || cpu_has_tsc || cpu_has_de)