diff options
Diffstat (limited to 'arch/sparc64/kernel/smp.c')
-rw-r--r-- | arch/sparc64/kernel/smp.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 7dc28a484268..8175a6968c6b 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
@@ -830,9 +830,16 @@ void smp_call_function_client(int irq, struct pt_regs *regs) | |||
830 | 830 | ||
831 | static void tsb_sync(void *info) | 831 | static void tsb_sync(void *info) |
832 | { | 832 | { |
833 | struct trap_per_cpu *tp = &trap_block[raw_smp_processor_id()]; | ||
833 | struct mm_struct *mm = info; | 834 | struct mm_struct *mm = info; |
834 | 835 | ||
835 | if (current->active_mm == mm) | 836 | /* It is not valid to test "currrent->active_mm == mm" here. |
837 | * | ||
838 | * The value of "current" is not changed atomically with | ||
839 | * switch_mm(). But that's OK, we just need to check the | ||
840 | * current cpu's trap block PGD physical address. | ||
841 | */ | ||
842 | if (tp->pgd_paddr == __pa(mm->pgd)) | ||
836 | tsb_context_switch(mm); | 843 | tsb_context_switch(mm); |
837 | } | 844 | } |
838 | 845 | ||