From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794319646; b=mId4bcXo2brMlQ+TCIfXtNPK9zk+qSvmVAM0rtMIOIQ+kXT9VTr5xepCYXj+2kRp9QR1 diljI1pUi9EhwnJcr0/QcTSGyGwlfumeTXL9LKZmnPCB0FE8o31fPCoztbbNLc9dYd9td TXBDrUiWutDXj7ocIQEsctbVe+R1r2H8i3gHo5z6UbpM86nvJBKollzOqzuwYWJ6osTBR EJv8JotO06yv2k9xc8/Njqk/p6uBHGxDK6m99RXzPiopHnufyofRMlbOalUql1PstAbjS VCekIo40iWzMUbvH9xhMfMeBy1vBNYMRiiS8UqNEpL2sLIFrNW/Pv0UMcMUQiUV+DFw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794319646; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=UxUMS3ie1kdIz+llsuKEMjVe8UDQ0Hz+v+qzz8l3Nek=; b=4WTh4fyrky7ZHu2V2rPmqpH9HntoiftpxD0PxolYTTpjuSQz127yE1yr/z1ZvylSuth3 +jf/zPAo2xE5GCTYW0xXBYuurVqyt6la4NcYqFb1kpuFwy7+qHJFvV6MFmc9zVQwiq8Cj tQa6AVuxWEAtZmLvo4jfvWloHja1AFDCCTjTUCiGeDNqdvECrq+flJn7bKHdIJ/JcZE6r GuQzUHAiAMxqTGg8RQ7QSgKpn467AvtqKwRe0X3ogodkoj0/BLEmnpikfQK5Ip0juL1hF vLJDlx+bAldslHGcWyP4IJiyeMeQKtCD4PUVFt3m8zFkAEHyrw66moMqpdGYVh06w5Q== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=f41Q14XR; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 63782606A325 for ; Tue, 10 Nov 2026 14:07:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=f41Q14XR Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6537A1F0089F; Tue, 10 Nov 2026 14:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794319646; bh=UxUMS3ie1kdIz+llsuKEMjVe8UDQ0Hz+v+qzz8l3Nek=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=f41Q14XRCr8Pussgk2UphUKayguhccfwAidRUtpnPqgY2UA4zijK11gsO74IqyI89 WYvEAQP3RoSksu+F2tYaZeZ4jIN9lDqupdzAx+jl4LY49m6zTv/dIZtMybQJTQ6ceB VQeBOMqfcpBBa40N+iTuA2hIVS6kbmMuZT0dVbXzr7wyOeuU1TY28HHwMAos4gC2Jj /4Cd5tzjcIfAA0ppNhKtKRaxkG6CaaBSgjZVjLp006wyImsX3sxSI/AZ9RjhhaIClQ Z2zmUftPoWpIRsihMXdHq2Yob70oVvr/t9GcNZpIg4nVXN2iYIRlAGzgZjdGFmtvWs d1xuTYTfgUVmw== From: Sasha Levin To: stable@vger.kernel.org Cc: Vincent Donnefort , Fuad Tabba , Marc Zyngier , Sasha Levin Subject: [PATCH 7.3.y] KVM: arm64: Use kvm_s2_fault_vma_info in pkvm_mem_abort() Date: Tue, 10 Nov 2026 09:07:24 -0500 Message-ID: <20261110140655.1833142-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261107050359-failed-7.3-0cdcc1039200@kernel.org> References: <20261107050359-failed-7.3-0cdcc1039200@kernel.org> X-Mailing-List: stable@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Vincent Donnefort [ Upstream commit 0cdcc1039200b3c4fbc2ae3f9b5c1be1bc9155e8 ] To paraphrase Marc in commit 08f97454b7fa ("KVM: arm64: Fix protected mode handling of pages larger than 4kB"), pkvm_pgtable_stage2_map() assumes the address passed as a parameter is aligned to the size of the intended mapping, while HPFAR_EL2 gives the IPA minus the bottom 12 bits, regardless of the system page size configuration. To fix this alignment, bring support for kvm_s2_fault_vma_info in pkvm_mem_abort() and use its members where possible. They do contain the page-alignment we need to fix the fault on system with pages larger than 4K. Also, add a check at the start of pkvm_pgtable_stage2_map(), it does not support !PAGE_ALIGNED arguments. Fixes: ea03466e806f ("KVM: arm64: Handle aborts from protected VMs") Cc: stable@vger.kernel.org Signed-off-by: Vincent Donnefort Reviewed-by: Fuad Tabba Tested-by: Fuad Tabba Link: https://patch.msgid.link/20260928095454.3255918-5-vdonnefort@google.com Signed-off-by: Marc Zyngier Signed-off-by: Sasha Levin --- Depends on <20261110114632.607777-1-sashal@kernel.org> arch/arm64/kvm/mmu.c | 27 ++++++++++++++++++--------- arch/arm64/kvm/pkvm.c | 3 +++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 9ebc17d3e0c00..cae133805c76b 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1383,9 +1383,11 @@ static bool fault_supports_stage2_huge_mapping(const struct kvm_s2_fault_desc *s if (map_size == PAGE_SIZE) return true; - /* pKVM only supports PMD_SIZE huge-mappings */ - if (is_protected_kvm_enabled() && map_size != PMD_SIZE) - return false; + /* pKVM only supports PMD_SIZE huge-mappings for non-protected VMs */ + if (is_protected_kvm_enabled()) { + if (vcpu_is_protected(s2fd->vcpu) || map_size != PMD_SIZE) + return false; + } size = memslot->npages * PAGE_SIZE; @@ -1609,6 +1611,9 @@ struct kvm_s2_fault_vma_info { bool map_non_cacheable; }; +static int kvm_s2_fault_get_vma_info(const struct kvm_s2_fault_desc *s2fd, + struct kvm_s2_fault_vma_info *s2vi); + static gfn_t get_canonical_gfn(const struct kvm_s2_fault_desc *s2fd, const struct kvm_s2_fault_vma_info *s2vi); @@ -1698,12 +1703,12 @@ static int gmem_abort(const struct kvm_s2_fault_desc *s2fd) static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd) { unsigned int flags = FOLL_HWPOISON | FOLL_LONGTERM | FOLL_WRITE; + struct kvm_s2_fault_vma_info s2vi = {}; struct kvm_vcpu *vcpu = s2fd->vcpu; struct kvm_pgtable *pgt = vcpu->arch.hw_mmu->pgt; struct mm_struct *mm = current->mm; struct kvm *kvm = vcpu->kvm; void *hyp_memcache; - struct page *page; int ret; hyp_memcache = get_mmu_memcache(vcpu); @@ -1711,12 +1716,16 @@ static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd) if (ret) return -ENOMEM; + ret = kvm_s2_fault_get_vma_info(s2fd, &s2vi); + if (ret) + return ret; + ret = account_locked_vm(mm, 1, true); if (ret) return ret; mmap_read_lock(mm); - ret = pin_user_pages(s2fd->hva, 1, flags, &page); + ret = pin_user_pages(s2fd->hva, 1, flags, &s2vi.page); mmap_read_unlock(mm); if (ret == -EHWPOISON) { @@ -1726,7 +1735,7 @@ static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd) } else if (ret != 1) { ret = -EFAULT; goto dec_account; - } else if (!folio_test_swapbacked(page_folio(page))) { + } else if (!folio_test_swapbacked(page_folio(s2vi.page))) { /* * We really can't deal with page-cache pages returned by GUP * because (a) we may trigger writeback of a page for which we @@ -1746,8 +1755,8 @@ static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd) } write_lock(&kvm->mmu_lock); - ret = pkvm_pgtable_stage2_map(pgt, s2fd->fault_ipa, PAGE_SIZE, - page_to_phys(page), KVM_PGTABLE_PROT_RWX, + ret = pkvm_pgtable_stage2_map(pgt, gfn_to_gpa(s2vi.gfn), PAGE_SIZE, + page_to_phys(s2vi.page), KVM_PGTABLE_PROT_RWX, hyp_memcache, 0); write_unlock(&kvm->mmu_lock); if (ret) { @@ -1758,7 +1767,7 @@ static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd) return 0; unpin: - unpin_user_pages(&page, 1); + unpin_user_page(s2vi.page); dec_account: account_locked_vm(mm, 1, false); return ret; diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c index 8e4c6e4bec123..c298a5b9b12a6 100644 --- a/arch/arm64/kvm/pkvm.c +++ b/arch/arm64/kvm/pkvm.c @@ -414,6 +414,9 @@ int pkvm_pgtable_stage2_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 end = addr + size; int ret; + if (WARN_ON_ONCE(!PAGE_ALIGNED(addr | size))) + return -EINVAL; + lockdep_assert_held_write(&kvm->mmu_lock); mapping = pkvm_mapping_iter_first(&pgt->pkvm_mappings, addr, end - 1); -- 2.53.0