瀏覽代碼

[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>
David S. Miller 19 年之前
父節點
當前提交
aac0aadf09
共有 1 個文件被更改,包括 10 次插入6 次删除
  1. 10 6
      arch/sparc64/kernel/smp.c

+ 10 - 6
arch/sparc64/kernel/smp.c

@@ -909,14 +909,18 @@ void smp_receive_signal_client(int irq, struct pt_regs *regs)
 	 */
 	mm = current->active_mm;
 	if (likely(mm)) {
-		if (unlikely(!CTX_VALID(mm->context))) {
-			unsigned long flags;
+		unsigned long flags;
 
-			spin_lock_irqsave(&mm->context.lock, flags);
+		spin_lock_irqsave(&mm->context.lock, flags);
+
+		if (unlikely(!CTX_VALID(mm->context)))
 			get_new_mmu_context(mm);
-			load_secondary_context(mm);
-			spin_unlock_irqrestore(&mm->context.lock, flags);
-		}
+
+		load_secondary_context(mm);
+		__flush_tlb_mm(CTX_HWBITS(mm->context),
+			       SECONDARY_CONTEXT);
+
+		spin_unlock_irqrestore(&mm->context.lock, flags);
 	}
 }