KVM: arm64: Handle access faults behind the read lock
authorOliver Upton <oliver.upton@linux.dev>
Fri, 2 Dec 2022 18:51:55 +0000 (18:51 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 12 Jan 2023 21:09:20 +0000 (21:09 +0000)
As the underlying software walkers are able to traverse and update
stage-2 in parallel there is no need to serialize access faults.

Only take the read lock when handling an access fault.

Link: https://lore.kernel.org/r/20221202185156.696189-6-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/hyp/pgtable.c
arch/arm64/kvm/mmu.c

index aa36d89..30575b5 100644 (file)
@@ -1120,7 +1120,8 @@ kvm_pte_t kvm_pgtable_stage2_mkyoung(struct kvm_pgtable *pgt, u64 addr)
 
        ret = stage2_update_leaf_attrs(pgt, addr, 1, KVM_PTE_LEAF_ATTR_LO_S2_AF, 0,
                                       &pte, NULL,
-                                      KVM_PGTABLE_WALK_HANDLE_FAULT);
+                                      KVM_PGTABLE_WALK_HANDLE_FAULT |
+                                      KVM_PGTABLE_WALK_SHARED);
        if (!ret)
                dsb(ishst);
 
index edfbe85..d24ce2d 100644 (file)
@@ -1406,10 +1406,10 @@ static void handle_access_fault(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
 
        trace_kvm_access_fault(fault_ipa);
 
-       write_lock(&vcpu->kvm->mmu_lock);
+       read_lock(&vcpu->kvm->mmu_lock);
        mmu = vcpu->arch.hw_mmu;
        pte = kvm_pgtable_stage2_mkyoung(mmu->pgt, fault_ipa);
-       write_unlock(&vcpu->kvm->mmu_lock);
+       read_unlock(&vcpu->kvm->mmu_lock);
 
        if (kvm_pte_valid(pte))
                kvm_set_pfn_accessed(kvm_pte_to_pfn(pte));