[IA64] - Avoid slow TLB purges on SGI Altix systems
[deliverable/linux.git] / arch / ia64 / mm / tlb.c
index 464557e4ed8241f5755782730495a4e434446c59..99ea8c70f408c76d41ed161689a2072ea79394bc 100644 (file)
@@ -86,10 +86,15 @@ wrap_mmu_context (struct mm_struct *mm)
 }
 
 void
-ia64_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits)
+ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long nbits)
 {
        static DEFINE_SPINLOCK(ptcg_lock);
 
+       if (mm != current->active_mm) {
+               flush_tlb_all();
+               return;
+       }
+
        /* HW requires global serialization of ptc.ga.  */
        spin_lock(&ptcg_lock);
        {
@@ -135,15 +140,12 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long
        unsigned long size = end - start;
        unsigned long nbits;
 
+#ifndef CONFIG_SMP
        if (mm != current->active_mm) {
-               /* this does happen, but perhaps it's not worth optimizing for? */
-#ifdef CONFIG_SMP
-               flush_tlb_all();
-#else
                mm->context = 0;
-#endif
                return;
        }
+#endif
 
        nbits = ia64_fls(size + 0xfff);
        while (unlikely (((1UL << nbits) & purge.mask) == 0) && (nbits < purge.max_bits))
@@ -153,7 +155,7 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long
        start &= ~((1UL << nbits) - 1);
 
 # ifdef CONFIG_SMP
-       platform_global_tlb_purge(start, end, nbits);
+       platform_global_tlb_purge(mm, start, end, nbits);
 # else
        do {
                ia64_ptcl(start, (nbits<<2));
This page took 0.036622 seconds and 5 git commands to generate.