powerpc/mm: Batch tlb flush when invalidating pte entries
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Mon, 28 Nov 2016 06:17:04 +0000 (11:47 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 28 Nov 2016 11:45:49 +0000 (22:45 +1100)
This will improve the task exit case, by batching tlb invalidates.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/book3s/64/radix.h

index f4066cf31b3ed816847560aa028d11430a3c7f20..b4d1302387a3fee203c6b80a9fcb7b73c9b9136b 100644 (file)
@@ -140,13 +140,20 @@ static inline unsigned long radix__pte_update(struct mm_struct *mm,
                unsigned long new_pte;
 
                old_pte = __radix_pte_update(ptep, ~0, 0);
-               asm volatile("ptesync" : : : "memory");
                /*
                 * new value of pte
                 */
                new_pte = (old_pte | set) & ~clr;
-               radix__flush_tlb_pte_p9_dd1(old_pte, mm, addr);
-               __radix_pte_update(ptep, 0, new_pte);
+               /*
+                * If we are trying to clear the pte, we can skip
+                * the below sequence and batch the tlb flush. The
+                * tlb flush batching is done by mmu gather code
+                */
+               if (new_pte) {
+                       asm volatile("ptesync" : : : "memory");
+                       radix__flush_tlb_pte_p9_dd1(old_pte, mm, addr);
+                       __radix_pte_update(ptep, 0, new_pte);
+               }
        } else
                old_pte = __radix_pte_update(ptep, clr, set);
        asm volatile("ptesync" : : : "memory");