Commit 1d8c3c23 authored by Oliver Upton's avatar Oliver Upton
Browse files

KVM: arm64: Ensure canonical IPA is hugepage-aligned when handling fault



Zenghui reports that VMs backed by hugetlb pages are no longer booting
after commit fd276e71 ("KVM: arm64: nv: Handle shadow stage 2 page
faults").

Support for shadow stage-2 MMUs introduced the concept of a fault IPA
and canonical IPA to stage-2 fault handling. These are identical in the
non-nested case, as the hardware stage-2 context is always that of the
canonical IPA space.

Both addresses need to be hugepage-aligned when preparing to install a
hugepage mapping to ensure that KVM uses the correct GFN->PFN translation
and installs that at the correct IPA for the current stage-2.

And now I'm feeling thirsty after all this talk of IPAs...

Fixes: fd276e71 ("KVM: arm64: nv: Handle shadow stage 2 page faults")
Reported-by: default avatarZenghui Yu <yuzenghui@huawei.com>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240822071710.2291690-1-oliver.upton@linux.dev


Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent f6165067
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1540,8 +1540,15 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
		vma_pagesize = min(vma_pagesize, (long)max_map_size);
	}

	if (vma_pagesize == PMD_SIZE || vma_pagesize == PUD_SIZE)
	/*
	 * Both the canonical IPA and fault IPA must be hugepage-aligned to
	 * ensure we find the right PFN and lay down the mapping in the right
	 * place.
	 */
	if (vma_pagesize == PMD_SIZE || vma_pagesize == PUD_SIZE) {
		fault_ipa &= ~(vma_pagesize - 1);
		ipa &= ~(vma_pagesize - 1);
	}

	gfn = ipa >> PAGE_SHIFT;
	mte_allowed = kvm_vma_mte_allowed(vma);