powerpc/64s/radix: avoid ptesync after set_pte and ptep_set_access_flags
authorNicholas Piggin <npiggin@gmail.com>
Fri, 1 Jun 2018 10:01:19 +0000 (20:01 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 3 Jun 2018 10:40:36 +0000 (20:40 +1000)
commitf1cb8f9beba8699dd1b4518418191499e53f7b17
tree0d66bcf4ae3fe02d0556cd4e9079550a3d3a7d75
parent68662f85f3c3ea8a6fb61586a05955ab51bbb9e6
powerpc/64s/radix: avoid ptesync after set_pte and ptep_set_access_flags

The ISA suggests ptesync after setting a pte, to prevent a table walk
initiated by a subsequent access from missing that store and causing a
spurious fault. This is an architectual allowance that allows an
implementation's page table walker to be incoherent with the store
queue.

However there is no correctness problem in taking a spurious fault in
userspace -- the kernel copes with these at any time, so the updated
pte will be found eventually. Spurious kernel faults on vmap memory
must be avoided, so a ptesync is put into flush_cache_vmap.

On POWER9 so far I have not found a measurable window where this can
result in more minor faults, so as an optimisation, remove the costly
ptesync from pte updates. If an implementation benefits from ptesync,
it would be better to add it back in update_mmu_cache, so it's not
done for things like fork(2).

fork --fork --exec benchmark improved 5.2% (12400->13100).

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
arch/powerpc/include/asm/cacheflush.h
arch/powerpc/mm/pgtable-radix.c