diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 5ff2483e70bfdb8642a76d4912dd7f6ce50d8b53..eb7c0f855ba7c03e1b3c0e59061660fd083aeee1 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)
 	 */
 	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);
 	}
 }