Re: [PATCH v11 19/43] KVM: arm64: nv: Handle shadow stage 2 page faults
From: Marc Zyngier <maz@kernel.org>
Date: 2024-01-17 15:53:52
Also in:
kvm, kvmarm
On Wed, 17 Jan 2024 14:53:16 +0000, Joey Gouly [off-list ref] wrote:
Hi Marc, Drive by thing I spotted. On Mon, Nov 20, 2023 at 01:10:03PM +0000, Marc Zyngier wrote:quoted
If we are faulting on a shadow stage 2 translation, we first walk the guest hypervisor's stage 2 page table to see if it has a mapping. If not, we inject a stage 2 page fault to the virtual EL2. Otherwise, we create a mapping in the shadow stage 2 page table. Note that we have to deal with two IPAs when we got a shadow stage 2 page fault. One is the address we faulted on, and is in the L2 guest phys space. The other is from the guest stage-2 page table walk, and is in the L1 guest phys space. To differentiate them, we rename variables so that fault_ipa is used for the former and ipa is used for the latter. Co-developed-by: Christoffer Dall <redacted> Co-developed-by: Jintack Lim <redacted> Signed-off-by: Christoffer Dall <redacted> Signed-off-by: Jintack Lim <redacted> [maz: rewrote this multiple times...] Signed-off-by: Marc Zyngier <maz@kernel.org> --- arch/arm64/include/asm/kvm_emulate.h | 7 +++ arch/arm64/include/asm/kvm_nested.h | 19 ++++++ arch/arm64/kvm/mmu.c | 89 ++++++++++++++++++++++++---- arch/arm64/kvm/nested.c | 48 +++++++++++++++ 4 files changed, 153 insertions(+), 10 deletions(-)[.. snip ..]quoted
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 588ce46c0ad0..41de7616b735 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c@@ -1412,14 +1412,16 @@ static bool kvm_vma_mte_allowed(struct vm_area_struct *vma) } static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, - struct kvm_memory_slot *memslot, unsigned long hva, - unsigned long fault_status) + struct kvm_s2_trans *nested, + struct kvm_memory_slot *memslot, + unsigned long hva, unsigned long fault_status) { int ret = 0; bool write_fault, writable, force_pte = false; bool exec_fault, mte_allowed; bool device = false; unsigned long mmu_seq; + phys_addr_t ipa = fault_ipa; struct kvm *kvm = vcpu->kvm; struct kvm_mmu_memory_cache *memcache = &vcpu->arch.mmu_page_cache; struct vm_area_struct *vma;@@ -1504,10 +1506,38 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, } vma_pagesize = 1UL << vma_shift; + + if (nested) { + unsigned long max_map_size; + + max_map_size = force_pte ? PUD_SIZE : PAGE_SIZE;This seems like the wrong way around, presumably you want PAGE_SIZE for force_pte?
This is hilarious. I really shouldn't write code these days. Thanks a lot for spotting this one, I'll fix that right away! Cheers, M. -- Without deviation from the norm, progress is not possible. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel