Browse Source

[PARISC] Optimize TLB flush on SMP systems

Signed-off-by: Randolph Chung <tausq@debian.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Randolph Chung 18 years ago
parent
commit
592ac93a60
1 changed files with 11 additions and 13 deletions
  1. 11 13
      include/asm-parisc/tlbflush.h

+ 11 - 13
include/asm-parisc/tlbflush.h

@@ -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)