aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/entry.S
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2005-09-12 12:49:24 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-12 13:49:58 -0400
commite5bc8b6baf86538f3d0407cf0880f86aec828a13 (patch)
treeb67a98a866a51286fd342d08b27b511826875138 /arch/x86_64/kernel/entry.S
parent83b942bd3437d84d6ddf582477120b6b86369052 (diff)
[PATCH] x86-64: Make remote TLB flush more scalable
Instead of using a global spinlock to protect the state of the remote TLB flush use a lock and state for each sending CPU. To tell the receiver where to look for the state use 8 different call vectors. Each CPU uses a specific vector to trigger flushes on other CPUs. Depending on the received vector the target CPUs look into the right per cpu variable for the flush data. When the system has more than 8 CPUs they are hashed to the 8 available vectors. The limited global vector space forces us to this right now. In future when interrupts are split into per CPU domains this could be fixed, at the cost of needing more IPIs in flat mode. Also some minor cleanup in the smp flush code and remove some outdated debug code. Requires patch to move cpu_possible_map setup earlier. Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64/kernel/entry.S')
-rw-r--r--arch/x86_64/kernel/entry.S15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S
index 3620508c8bd9..873c39d8f818 100644
--- a/arch/x86_64/kernel/entry.S
+++ b/arch/x86_64/kernel/entry.S
@@ -536,8 +536,19 @@ ENTRY(thermal_interrupt)
536ENTRY(reschedule_interrupt) 536ENTRY(reschedule_interrupt)
537 apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt 537 apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt
538 538
539ENTRY(invalidate_interrupt) 539 .macro INVALIDATE_ENTRY num
540 apicinterrupt INVALIDATE_TLB_VECTOR,smp_invalidate_interrupt 540ENTRY(invalidate_interrupt\num)
541 apicinterrupt INVALIDATE_TLB_VECTOR_START+\num,smp_invalidate_interrupt
542 .endm
543
544 INVALIDATE_ENTRY 0
545 INVALIDATE_ENTRY 1
546 INVALIDATE_ENTRY 2
547 INVALIDATE_ENTRY 3
548 INVALIDATE_ENTRY 4
549 INVALIDATE_ENTRY 5
550 INVALIDATE_ENTRY 6
551 INVALIDATE_ENTRY 7
541 552
542ENTRY(call_function_interrupt) 553ENTRY(call_function_interrupt)
543 apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt 554 apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt