OSDN Git Service

powerpc/64s/radix: make ptep_get_and_clear_full non-atomic for the full case
authorNicholas Piggin <npiggin@gmail.com>
Fri, 1 Jun 2018 10:01:17 +0000 (20:01 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 3 Jun 2018 10:40:35 +0000 (20:40 +1000)
This matches other architectures, when we know there will be no
further accesses to the address (e.g., for teardown), page table
entries can be cleared non-atomically.

The comments about NMMU are bogus: all MMU notifiers (including NMMU)
are released at this point, with their TLBs flushed. An NMMU access at
this point would be a bug.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/book3s/64/radix.h

index 62a73a7..01f6c2c 100644 (file)
@@ -180,14 +180,8 @@ static inline pte_t radix__ptep_get_and_clear_full(struct mm_struct *mm,
        unsigned long old_pte;
 
        if (full) {
-               /*
-                * If we are trying to clear the pte, we can skip
-                * the DD1 pte update sequence and batch the tlb flush. The
-                * tlb flush batching is done by mmu gather code. We
-                * still keep the cmp_xchg update to make sure we get
-                * correct R/C bit which might be updated via Nest MMU.
-                */
-               old_pte = __radix_pte_update(ptep, ~0ul, 0);
+               old_pte = pte_val(*ptep);
+               *ptep = __pte(0);
        } else
                old_pte = radix__pte_update(mm, addr, ptep, ~0ul, 0, 0);