aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/smp.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2006-02-27 20:56:51 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:14:08 -0500
commitaac0aadf09b98ba36eab0bb02a560ebcb82ac39f (patch)
tree0628f23fd3d7bd343966e038d6328f9bf0e8751d /arch/sparc64/kernel/smp.c
parent6889331a1260e42b0275f42c13d6342d6cc1a03d (diff)
[SPARC64]: Fix bugs in SMP TLB context version expiration handling.
1) We must flush the TLB, duh. 2) Even if the sw context was seen to be valid, the local cpu's hw context can be out of date, so reload it unconditionally. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/smp.c')
-rw-r--r--arch/sparc64/kernel/smp.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 5ff2483e70bf..eb7c0f855ba7 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -909,14 +909,18 @@ void smp_receive_signal_client(int irq, struct pt_regs *regs)
909 */ 909 */
910 mm = current->active_mm; 910 mm = current->active_mm;
911 if (likely(mm)) { 911 if (likely(mm)) {
912 if (unlikely(!CTX_VALID(mm->context))) { 912 unsigned long flags;
913 unsigned long flags;
914 913
915 spin_lock_irqsave(&mm->context.lock, flags); 914 spin_lock_irqsave(&mm->context.lock, flags);
915
916 if (unlikely(!CTX_VALID(mm->context)))
916 get_new_mmu_context(mm); 917 get_new_mmu_context(mm);
917 load_secondary_context(mm); 918
918 spin_unlock_irqrestore(&mm->context.lock, flags); 919 load_secondary_context(mm);
919 } 920 __flush_tlb_mm(CTX_HWBITS(mm->context),
921 SECONDARY_CONTEXT);
922
923 spin_unlock_irqrestore(&mm->context.lock, flags);
920 } 924 }
921} 925}
922 926