浏览代码

[PATCH] x86_64: Fix race in TSC synchronization

Plug a race in TSC synchronization

We need to do tsc_sync_wait() before the CPU is set online to prevent
multiple CPUs from doing it in parallel - which won't work because TSC
sync has global unprotected state.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Andi Kleen 20 年之前
父节点
当前提交
1eecd73cce
共有 1 个文件被更改,包括 8 次插入7 次删除
  1. 8 7
      arch/x86_64/kernel/smpboot.c

+ 8 - 7
arch/x86_64/kernel/smpboot.c

@@ -492,6 +492,14 @@ void __cpuinit start_secondary(void)
 	 */
 	 */
 	set_cpu_sibling_map(smp_processor_id());
 	set_cpu_sibling_map(smp_processor_id());
 
 
+	/* 
+  	 * Wait for TSC sync to not schedule things before.
+	 * We still process interrupts, which could see an inconsistent
+	 * time in that window unfortunately. 
+	 * Do this here because TSC sync has global unprotected state.
+ 	 */
+	tsc_sync_wait();
+
 	/*
 	/*
 	 * We need to hold call_lock, so there is no inconsistency
 	 * We need to hold call_lock, so there is no inconsistency
 	 * between the time smp_call_function() determines number of
 	 * between the time smp_call_function() determines number of
@@ -509,13 +517,6 @@ void __cpuinit start_secondary(void)
 	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
 	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
 	unlock_ipi_call_lock();
 	unlock_ipi_call_lock();
 
 
-	mb();
-
-	/* Wait for TSC sync to not schedule things before.
-	   We still process interrupts, which could see an inconsistent
-	   time in that window unfortunately. */
-	tsc_sync_wait();
-
 	cpu_idle();
 	cpu_idle();
 }
 }