powerpc/32s: Don't flush all TLBs when flushing one page
authorChristophe Leroy <christophe.leroy@c-s.fr>
Sat, 1 Feb 2020 08:04:31 +0000 (08:04 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 19 Feb 2020 11:46:08 +0000 (22:46 +1100)
When flushing any memory range, the flushing function
flushes all TLBs.

When (start) and (end - 1) are in the same memory page,
flush that page instead.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Reviewed-by: Segher Boessenkool <segher@kernel.crashing.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/b30b2eae6960502eaf0d9e36c60820b839693c33.1580542939.git.christophe.leroy@c-s.fr
arch/powerpc/mm/book3s32/tlb.c

index 2fcd321..724c049 100644 (file)
@@ -79,11 +79,14 @@ static void flush_range(struct mm_struct *mm, unsigned long start,
        int count;
        unsigned int ctx = mm->context.id;
 
+       start &= PAGE_MASK;
        if (!Hash) {
-               _tlbia();
+               if (end - start <= PAGE_SIZE)
+                       _tlbie(start);
+               else
+                       _tlbia();
                return;
        }
-       start &= PAGE_MASK;
        if (start >= end)
                return;
        end = (end - 1) | ~PAGE_MASK;