[PARISC] Optimize TLB flush on SMP systems
authorRandolph Chung <tausq@debian.org>
Tue, 12 Dec 2006 00:07:51 +0000 (16:07 -0800)
committerKyle McMartin <kyle@athena.road.mcmartin.ca>
Sat, 17 Feb 2007 05:41:27 +0000 (00:41 -0500)
Signed-off-by: Randolph Chung <tausq@debian.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
include/asm-parisc/tlbflush.h

index f662e837dea14a1a0533e59b368daa5ef5406032..67b3814a71ddac1afe88df79580b0e00eb75b926 100644 (file)
@@ -39,21 +39,19 @@ extern void flush_tlb_all_local(void *);
  * etc. do not do that).
  */
 
-static inline void flush_tlb_mm(struct mm_struct *mm)
+static inline void __flush_tlb_mm(void *mmv)
 {
-       BUG_ON(mm == &init_mm); /* Should never happen */
+       struct mm_struct *mm = (struct mm_struct *)mmv;
+       if (mm == current->active_mm)
+               load_context(mm->context);
+}
 
-#ifdef CONFIG_SMP
-       flush_tlb_all();
-#else
-       if (mm) {
-               if (mm->context != 0)
-                       free_sid(mm->context);
-               mm->context = alloc_sid();
-               if (mm == current->active_mm)
-                       load_context(mm->context);
-       }
-#endif
+static inline void flush_tlb_mm(struct mm_struct *mm)
+{
+       if (mm->context != 0)
+               free_sid(mm->context);
+       mm->context = alloc_sid();
+       on_each_cpu(__flush_tlb_mm, mm, 1, 1);
 }
 
 extern __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long start, unsigned long end)