| From 976d34e2dab10ece5ea8fe7090b7692913f89084 Mon Sep 17 00:00:00 2001 |
| From: Punit Agrawal <punit.agrawal@arm.com> |
| Date: Mon, 13 Aug 2018 11:43:51 +0100 |
| Subject: KVM: arm/arm64: Skip updating PTE entry if no change |
| |
| From: Punit Agrawal <punit.agrawal@arm.com> |
| |
| commit 976d34e2dab10ece5ea8fe7090b7692913f89084 upstream. |
| |
| When there is contention on faulting in a particular page table entry |
| at stage 2, the break-before-make requirement of the architecture can |
| lead to additional refaulting due to TLB invalidation. |
| |
| Avoid this by skipping a page table update if the new value of the PTE |
| matches the previous value. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: d5d8184d35c9 ("KVM: ARM: Memory virtualization setup") |
| Reviewed-by: Suzuki Poulose <suzuki.poulose@arm.com> |
| Acked-by: Christoffer Dall <christoffer.dall@arm.com> |
| Signed-off-by: Punit Agrawal <punit.agrawal@arm.com> |
| Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| virt/kvm/arm/mmu.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/virt/kvm/arm/mmu.c |
| +++ b/virt/kvm/arm/mmu.c |
| @@ -985,6 +985,10 @@ static int stage2_set_pte(struct kvm *kv |
| /* Create 2nd stage page table mapping - Level 3 */ |
| old_pte = *pte; |
| if (pte_present(old_pte)) { |
| + /* Skip page table update if there is no change */ |
| + if (pte_val(old_pte) == pte_val(*new_pte)) |
| + return 0; |
| + |
| kvm_set_pte(pte, __pte(0)); |
| kvm_tlb_flush_vmid_ipa(kvm, addr); |
| } else { |