[parisc-linux] [patch] tlbflush "improvement"

Randolph Chung randolph at tausq.org
Mon Dec 11 09:24:41 MST 2006


This patch tries to get rid of our current "blow away the tlb on each 
fork()" behavior in SMP builds. Tested lightly on pa8800. Comments welcome.

I say "improvement" in quotes because I did not see a significant perf 
improvement in kernel build times, but theoretically it should be more 
performant :)

I think we need to do some threading testcases to exercise this 
sufficiently.... any volunteers? :)

randolph

diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h
index f662e83..2e8c2bd 100644
--- a/include/asm-parisc/tlbflush.h
+++ b/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 s



More information about the parisc-linux mailing list