forked from Minki/linux
[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>
This commit is contained in:
parent
5e5ec10499
commit
1eecd73cce
@ -492,6 +492,14 @@ void __cpuinit start_secondary(void)
|
||||
*/
|
||||
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
|
||||
* 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;
|
||||
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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user