KVM: arm64: Always invalidate TLB for stage-2 permission faults
authorOliver Upton <oliver.upton@linux.dev>
Fri, 22 Sep 2023 22:32:29 +0000 (22:32 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 30 Oct 2023 20:12:46 +0000 (20:12 +0000)
commitbe097997a273259f1723baac5463cf19d8564efa
tree7dade843be7081f6398a1424bca06022aeacdd54
parentc04bf723ccd639250fa680a0fb4e1ac15bb84c3b
KVM: arm64: Always invalidate TLB for stage-2 permission faults

It is possible for multiple vCPUs to fault on the same IPA and attempt
to resolve the fault. One of the page table walks will actually update
the PTE and the rest will return -EAGAIN per our race detection scheme.
KVM elides the TLB invalidation on the racing threads as the return
value is nonzero.

Before commit a12ab1378a88 ("KVM: arm64: Use local TLBI on permission
relaxation") KVM always used broadcast TLB invalidations when handling
permission faults, which had the convenient property of making the
stage-2 updates visible to all CPUs in the system. However now we do a
local invalidation, and TLBI elision leads to the vCPU thread faulting
again on the stale entry. Remember that the architecture permits the TLB
to cache translations that precipitate a permission fault.

Invalidate the TLB entry responsible for the permission fault if the
stage-2 descriptor has been relaxed, regardless of which thread actually
did the job.

Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230922223229.1608155-1-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/hyp/pgtable.c