From nobody Mon Feb 9 00:00:56 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17CA933AD8A for ; Thu, 29 Jan 2026 01:16:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649366; cv=none; b=p/FXpj+Syfj4eAXe0T+YKvdoz3f7RfrSikvAIzlmUdMyN+OaDawVlJUGISgHWoYBn4oydYMTnvCXlc3vKGsHpKyECOKpX60zEMynzRPqe2gePMmzyfo0Zr1zVOmntnEWlAZ9UXZVhWy9RlfitZ1Rz57r2owjTuhSO7JuOHQbJx0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649366; c=relaxed/simple; bh=AXxQxnhtnt5YWRVt+lGWA6sUB4Tt8qHFbJ97Bkuq2Ck=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uiMuzDSPESNhue8gL0AKYnpBHXM1x8sd0hZUSuqOKHeBMnN8A5xt8xUnmbpvPdayakB+DcFMElMKOPai48N4j7MLwGqAqvnmlNKcJzH9WJdW3NxYUzEMOJgEZkvPld2ggSTQt3RDmq7FwEf34i9imG66ucNAzI9gqp3j8lcwbZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=0XC4V+9H; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="0XC4V+9H" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-352de7a89e1so338203a91.1 for ; Wed, 28 Jan 2026 17:16:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769649363; x=1770254163; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=CQTLYZXbjXhuegQycdxIvwBS6byU7gVEkkc0u846/P4=; b=0XC4V+9HgEwcFw83xyxzkzLqqU42+KuT1CemPHaI6AR9FH3kboNo4bWF2E+DnoI9qn YS4smVIMsi6FDL1UFhjFlcuDM431X9t0iQauv5CojKeovYTglVYa2iu/bS8CiE67QCpG g+XK5xAweSQTz9v8PkkLIUs1F+qmP0U3Xz+Q1vu2Jn6hg50HSYgavr9VeJoAZjok5Czy eaxocl3bfZQY0Jp6krzIG1ehPwnkWdRY71SMwiQ95b5eAB2oMnF9i+qRm5Qa4kBN7vg3 3e1M3ZL6Kjnr4j/soJfCj5zRTmigwIK1/td/Z5wg2tpb3MoqN//HXNlxpNkWluw4AeF6 W1MA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769649363; x=1770254163; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=CQTLYZXbjXhuegQycdxIvwBS6byU7gVEkkc0u846/P4=; b=tQi5ZCOu/++PTsye5nrD3+Q4XJUfPHr9LVW0GFMlsy2Zl3GmG0dNh4QBXhOZBbsdLy PjGuPmfIkYVVB1Y/1RKt72kjdSu84T79dad23mX6u228lA9FRgm8iSzw031wwM7fZNe5 WNpKNxoLZtEM+n+DvETSu4E6WMVWxB1q/sHY0loTrKB8QamgX8BKhXAOXU4tCGCRPT2Y BQXzA0iFE5wzkqWfPtp+7uAVGvXFxXY8pDd4O7QttrhC8ZVqwiE11+NF9OLLSTZYKPZK dJJG2N+uqWrcalHYqOUjyFNGglppKeigvJuAC9PSsqfVKO/vrdGvvNuYP8kQaGjQCTbD cKMQ== X-Gm-Message-State: AOJu0YyqYN9ryF0wFxSb/B28Sgvs8CODYJwvDcyeMH2RTQfinTZ1pJAB t4eXADzHDusEAZqxhjNAnzSNGgYZDMcSlEhmZLHLOmvGqIMZRY5h8XhUoFD6UinF5+Z5lU4sHiT 7i3UirA== X-Received: from pjbmy4.prod.google.com ([2002:a17:90b:4c84:b0:353:31e9:fe44]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:51cb:b0:340:a5b2:c305 with SMTP id 98e67ed59e1d1-353feccf407mr5767501a91.2.1769649363134; Wed, 28 Jan 2026 17:16:03 -0800 (PST) Reply-To: Sean Christopherson Date: Wed, 28 Jan 2026 17:14:50 -0800 In-Reply-To: <20260129011517.3545883-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260129011517.3545883-1-seanjc@google.com> X-Mailer: git-send-email 2.53.0.rc1.217.geba53bf80e-goog Message-ID: <20260129011517.3545883-19-seanjc@google.com> Subject: [RFC PATCH v5 18/45] KVM: TDX: Allocate PAMT memory for TD and vCPU control structures From: Sean Christopherson To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, Kiryl Shutsemau , Sean Christopherson , Paolo Bonzini Cc: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, Kai Huang , Rick Edgecombe , Yan Zhao , Vishal Annapurve , Ackerley Tng , Sagi Shahar , Binbin Wu , Xiaoyao Li , Isaku Yamahata Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Kirill A. Shutemov TDX TD control structures are provided to the TDX module at 4KB page size and require PAMT backing. This means for Dynamic PAMT they need to also have 4KB backings installed. Use the recently introduce TDX APIs for allocating/freeing control pages, which handle DPAMT maintenance, to allocate/free TD and vCPU pages for TDX guests. Signed-off-by: Kirill A. Shutemov [update log] Signed-off-by: Rick Edgecombe [sean: handle alloc+free+reclaim in one patch] Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/tdx.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 4ef414ee27b4..323aae4300a1 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -360,7 +360,7 @@ static void tdx_reclaim_control_page(struct page *ctrl_= page) if (tdx_reclaim_page(ctrl_page)) return; =20 - __free_page(ctrl_page); + __tdx_free_control_page(ctrl_page); } =20 struct tdx_flush_vp_arg { @@ -597,7 +597,7 @@ static void tdx_reclaim_td_control_pages(struct kvm *kv= m) =20 tdx_quirk_reset_page(kvm_tdx->td.tdr_page); =20 - __free_page(kvm_tdx->td.tdr_page); + __tdx_free_control_page(kvm_tdx->td.tdr_page); kvm_tdx->td.tdr_page =3D NULL; } =20 @@ -2412,7 +2412,7 @@ static int __tdx_td_init(struct kvm *kvm, struct td_p= arams *td_params, =20 atomic_inc(&nr_configured_hkid); =20 - tdr_page =3D alloc_page(GFP_KERNEL_ACCOUNT); + tdr_page =3D __tdx_alloc_control_page(GFP_KERNEL_ACCOUNT); if (!tdr_page) goto free_hkid; =20 @@ -2425,7 +2425,7 @@ static int __tdx_td_init(struct kvm *kvm, struct td_p= arams *td_params, goto free_tdr; =20 for (i =3D 0; i < kvm_tdx->td.tdcs_nr_pages; i++) { - tdcs_pages[i] =3D alloc_page(GFP_KERNEL_ACCOUNT); + tdcs_pages[i] =3D __tdx_alloc_control_page(GFP_KERNEL_ACCOUNT); if (!tdcs_pages[i]) goto free_tdcs; } @@ -2543,10 +2543,8 @@ static int __tdx_td_init(struct kvm *kvm, struct td_= params *td_params, teardown: /* Only free pages not yet added, so start at 'i' */ for (; i < kvm_tdx->td.tdcs_nr_pages; i++) { - if (tdcs_pages[i]) { - __free_page(tdcs_pages[i]); - tdcs_pages[i] =3D NULL; - } + __tdx_free_control_page(tdcs_pages[i]); + tdcs_pages[i] =3D NULL; } if (!kvm_tdx->td.tdcs_pages) kfree(tdcs_pages); @@ -2561,16 +2559,13 @@ static int __tdx_td_init(struct kvm *kvm, struct td= _params *td_params, free_cpumask_var(packages); =20 free_tdcs: - for (i =3D 0; i < kvm_tdx->td.tdcs_nr_pages; i++) { - if (tdcs_pages[i]) - __free_page(tdcs_pages[i]); - } + for (i =3D 0; i < kvm_tdx->td.tdcs_nr_pages; i++) + __tdx_free_control_page(tdcs_pages[i]); kfree(tdcs_pages); kvm_tdx->td.tdcs_pages =3D NULL; =20 free_tdr: - if (tdr_page) - __free_page(tdr_page); + __tdx_free_control_page(tdr_page); kvm_tdx->td.tdr_page =3D NULL; =20 free_hkid: @@ -2900,7 +2895,7 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u6= 4 vcpu_rcx) int ret, i; u64 err; =20 - page =3D alloc_page(GFP_KERNEL_ACCOUNT); + page =3D __tdx_alloc_control_page(GFP_KERNEL_ACCOUNT); if (!page) return -ENOMEM; tdx->vp.tdvpr_page =3D page; @@ -2920,7 +2915,7 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u6= 4 vcpu_rcx) } =20 for (i =3D 0; i < kvm_tdx->td.tdcx_nr_pages; i++) { - page =3D alloc_page(GFP_KERNEL_ACCOUNT); + page =3D __tdx_alloc_control_page(GFP_KERNEL_ACCOUNT); if (!page) { ret =3D -ENOMEM; goto free_tdcx; @@ -2942,7 +2937,7 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u6= 4 vcpu_rcx) * method, but the rest are freed here. */ for (; i < kvm_tdx->td.tdcx_nr_pages; i++) { - __free_page(tdx->vp.tdcx_pages[i]); + __tdx_free_control_page(tdx->vp.tdcx_pages[i]); tdx->vp.tdcx_pages[i] =3D NULL; } return -EIO; @@ -2970,16 +2965,14 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, = u64 vcpu_rcx) =20 free_tdcx: for (i =3D 0; i < kvm_tdx->td.tdcx_nr_pages; i++) { - if (tdx->vp.tdcx_pages[i]) - __free_page(tdx->vp.tdcx_pages[i]); + __tdx_free_control_page(tdx->vp.tdcx_pages[i]); tdx->vp.tdcx_pages[i] =3D NULL; } kfree(tdx->vp.tdcx_pages); tdx->vp.tdcx_pages =3D NULL; =20 free_tdvpr: - if (tdx->vp.tdvpr_page) - __free_page(tdx->vp.tdvpr_page); + __tdx_free_control_page(tdx->vp.tdvpr_page); tdx->vp.tdvpr_page =3D NULL; tdx->vp.tdvpr_pa =3D 0; =20 --=20 2.53.0.rc1.217.geba53bf80e-goog