From: Sohil Mehta <sohil.mehta@intel.com>
To: Rick Edgecombe <rick.p.edgecombe@intel.com>, <bp@alien8.de>,
<dave.hansen@intel.com>, <hpa@zytor.com>, <kas@kernel.org>,
<kvm@vger.kernel.org>, <linux-coco@lists.linux.dev>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<mingo@redhat.com>, <nik.borisov@suse.com>, <pbonzini@redhat.com>,
<seanjc@google.com>, <tglx@kernel.org>, <vannapurve@google.com>,
<x86@kernel.org>, <chao.gao@intel.com>, <yan.y.zhao@intel.com>,
<kai.huang@intel.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH v6 03/11] x86/virt/tdx: Add tdx_alloc/free_control_page() helpers
Date: Tue, 7 Jul 2026 20:50:29 -0700 [thread overview]
Message-ID: <7d39a92a-0555-41cb-91dd-96dace318dcf@intel.com> (raw)
In-Reply-To: <20260526023515.288829-4-rick.p.edgecombe@intel.com>
How about?
x86/virt/tdx: Add tdx_{alloc,free}_control_page() helpers
On 5/25/2026 7:35 PM, Rick Edgecombe wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
>
> Add helpers to use when allocating or preparing pages that are handed to
> the TDX-Module for use as control/S-EPT pages, and thus need Dynamic PAMT
> adjustments.
>
> The TDX module tracks some state for each page of physical memory that it
> might use. It calls this state the PAMT. It includes separate state for
> each page size a physical page could be utilized at within the TDX module
> (1GB, 2MB, 4KB). In Dynamic PAMT, only the 4KB page size state is
> allocated dynamically. So for pages that TDX will use as 2MB physically
> contiguous pages, Dynamic PAMT backing is not needed.
I lost the continuation in the last sentence. Why does it only talk
about 2MB if only 4KB is dynamically allocated. What about 1GB?
(Probably due to my lack of TDX knowledge)
Similarly, why do these functions only refer to 2MB only and not 1GB?
pamt_2mb_arg(), tdh_phymem_pamt_add(), tdh_phymem_pamt_remove().
>
> KVM will need to hand pages to the TDX module that it will use at 4KB
> granularity. So these pages will need Dynamic PAMT backing added before
> they are used by the TDX module, and removed afterwards.
>
...
> diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
> index 82dc27aecf297..74e75db5728c7 100644
> --- a/arch/x86/include/asm/tdx.h
> +++ b/arch/x86/include/asm/tdx.h
> @@ -37,6 +37,7 @@
>
> #include <uapi/asm/mce.h>
> #include <asm/tdx_global_metadata.h>
> +#include <linux/mm.h>
> #include <linux/pgtable.h>
>
> /*
> @@ -160,6 +161,12 @@ void tdx_guest_keyid_free(unsigned int keyid);
>
> void tdx_quirk_reset_paddr(unsigned long base, unsigned long size);
>
> +/* Number PAMT pages to be provided to TDX module per 2MB region of PA */
^^^ of PAMT pages
> +#define TDX_DPAMT_ENTRY_PAGE_CNT 2
> +
> +struct page *tdx_alloc_control_page(void);
> +void tdx_free_control_page(struct page *page);
> +
> struct tdx_td {
> /* TD root structure: */
> struct page *tdr_page;
> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index 9ebd192cb5c17..9e0812d87ab06 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c
> @@ -1919,6 +1919,165 @@ u64 tdh_phymem_page_wbinvd_hkid(u64 hkid, kvm_pfn_t pfn)
> }
> EXPORT_SYMBOL_FOR_KVM(tdh_phymem_page_wbinvd_hkid);
>
> +static int alloc_pamt_array(struct page **pamt_pages)
> +{
> + int i, j;
> +
> + for (i = 0; i < TDX_DPAMT_ENTRY_PAGE_CNT; i++) {
> + pamt_pages[i] = alloc_page(GFP_KERNEL_ACCOUNT);
> + if (!pamt_pages[i])
> + goto err;
> + }
> +
> + return 0;
> +err:
> + for (j = 0; j < i; j++)
> + __free_page(pamt_pages[j]);
> + return -ENOMEM;
Add a blank line before the return to separate from the for loop?
> +}
> +
> +static void free_pamt_array(struct page **pamt_pages)
> +{
> + for (int i = 0; i < TDX_DPAMT_ENTRY_PAGE_CNT; i++) {
> + /*
> + * Reset pages unconditionally to cover cases
> + * where they were passed to the TDX module.
> + */
> + tdx_quirk_reset_paddr(page_to_phys(pamt_pages[i]), PAGE_SIZE);
> +
> + __free_page(pamt_pages[i]);
> + }
> +}
> +
> +/*
> + * Calculate the arg needed for operating on the DPAMT backing for
> + * a given 4KB page.
> + */
> +static u64 pamt_2mb_arg(kvm_pfn_t pfn)
> +{
> + unsigned long hpa_2mb = ALIGN_DOWN(pfn << PAGE_SHIFT, PMD_SIZE);
> +
> + return hpa_2mb | TDX_PS_2M;
> +}
> +
> +/* Add PAMT backing for the given page. */
> +static u64 tdh_phymem_pamt_add(kvm_pfn_t pfn, struct page **pamt_pages)
> +{
> + struct tdx_module_args args = {
> + .rcx = pamt_2mb_arg(pfn),
> + .rdx = page_to_phys(pamt_pages[0]),
> + .r8 = page_to_phys(pamt_pages[1]),
> + };
> +
> + return seamcall(TDH_PHYMEM_PAMT_ADD, &args);
> +}
> +
> +/* Remove PAMT backing for the given page. */
> +static u64 tdh_phymem_pamt_remove(kvm_pfn_t pfn, struct page **pamt_pages)
> +{
> + struct tdx_module_args args = {
> + .rcx = pamt_2mb_arg(pfn),
> + };
> + u64 ret;
> +
> + ret = seamcall_ret(TDH_PHYMEM_PAMT_REMOVE, &args);
> + if (ret)
> + return ret;
> +
> + /* Copy PAMT pages out of the struct per the TDX ABI */
> + pamt_pages[0] = phys_to_page(args.rdx);
> + pamt_pages[1] = phys_to_page(args.r8);
> +
> + return 0;
> +}
> +
> +/* Allocate PAMT memory for the given page */
> +static int tdx_pamt_get(kvm_pfn_t pfn)
> +{
> + struct page *pamt_pages[TDX_DPAMT_ENTRY_PAGE_CNT];
> + u64 tdx_status;
> + int ret;
> +
> + if (!tdx_supports_dynamic_pamt(&tdx_sysinfo))
> + return 0;
> +
> + ret = alloc_pamt_array(pamt_pages);
> + if (ret)
> + return ret;
> +
> + tdx_status = tdh_phymem_pamt_add(pfn, pamt_pages);
> + if (tdx_status != TDX_SUCCESS) {
> + ret = -EIO;
> + goto out_free;
> + }
> +
> + return 0;
Blank line here as well.
> +out_free:
> + free_pamt_array(pamt_pages);
> + return ret;
> +}
> +
next prev parent reply other threads:[~2026-07-08 3:50 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-26 2:35 [PATCH v6 00/11] Dynamic PAMT Rick Edgecombe
2026-05-26 2:35 ` [PATCH v6 01/11] x86/virt/tdx: Simplify tdmr_get_pamt_sz() Rick Edgecombe
2026-06-04 16:05 ` Kiryl Shutsemau
2026-07-01 0:08 ` Edgecombe, Rick P
2026-06-11 18:25 ` Vishal Annapurve
2026-07-03 5:48 ` Chao Gao
2026-07-06 20:18 ` Edgecombe, Rick P
2026-07-07 3:24 ` Yan Zhao
2026-07-07 19:08 ` Edgecombe, Rick P
2026-07-07 23:22 ` Sohil Mehta
2026-07-08 1:23 ` Edgecombe, Rick P
2026-05-26 2:35 ` [PATCH v6 02/11] x86/virt/tdx: Allocate page bitmap for Dynamic PAMT Rick Edgecombe
2026-06-04 16:14 ` Kiryl Shutsemau
2026-07-01 0:14 ` Edgecombe, Rick P
2026-06-11 18:47 ` Vishal Annapurve
2026-07-03 8:26 ` Chao Gao
2026-07-07 3:59 ` Yan Zhao
2026-07-07 21:25 ` Edgecombe, Rick P
2026-07-08 0:49 ` Sohil Mehta
2026-07-08 2:07 ` Edgecombe, Rick P
2026-07-08 2:10 ` Edgecombe, Rick P
2026-07-08 3:35 ` Sohil Mehta
2026-05-26 2:35 ` [PATCH v6 03/11] x86/virt/tdx: Add tdx_alloc/free_control_page() helpers Rick Edgecombe
2026-06-08 2:11 ` Binbin Wu
2026-06-08 2:18 ` Yan Zhao
2026-07-01 0:15 ` Edgecombe, Rick P
2026-07-06 12:31 ` Chao Gao
2026-07-06 20:23 ` Edgecombe, Rick P
2026-07-08 3:50 ` Sohil Mehta [this message]
2026-05-26 2:35 ` [PATCH v6 04/11] x86/virt/tdx: Allocate ref counts for Dynamic PAMT memory Rick Edgecombe
2026-07-02 7:20 ` Binbin Wu
2026-07-06 20:26 ` Edgecombe, Rick P
2026-07-06 13:22 ` Chao Gao
2026-07-06 20:26 ` Edgecombe, Rick P
2026-07-07 4:53 ` Yan Zhao
2026-07-07 22:32 ` Edgecombe, Rick P
2026-05-26 2:35 ` [PATCH v6 05/11] x86/virt/tdx: Handle concurrent callers in tdx_pamt_get/put() Rick Edgecombe
2026-07-02 7:39 ` Binbin Wu
2026-07-06 20:27 ` Edgecombe, Rick P
2026-07-07 5:54 ` Chao Gao
2026-07-08 6:46 ` Yan Zhao
2026-05-26 2:35 ` [PATCH v6 06/11] x86/virt/tdx: Optimize tdx_pamt_get/put() Rick Edgecombe
2026-05-26 8:57 ` Chao Gao
2026-05-26 16:42 ` Edgecombe, Rick P
2026-06-04 16:59 ` Kiryl Shutsemau
2026-06-05 5:40 ` Chao Gao
2026-06-05 11:42 ` Kiryl Shutsemau
2026-06-05 16:23 ` Dave Hansen
2026-06-08 9:14 ` Kiryl Shutsemau
2026-06-08 9:50 ` Yan Zhao
2026-07-01 1:45 ` Edgecombe, Rick P
2026-07-01 5:37 ` Yan Zhao
2026-07-01 1:05 ` Edgecombe, Rick P
2026-07-07 6:45 ` Chao Gao
2026-07-08 8:46 ` Yan Zhao
2026-05-26 2:35 ` [PATCH v6 07/11] KVM: TDX: Allocate PAMT memory for TD and vCPU control structures Rick Edgecombe
2026-07-02 8:55 ` Binbin Wu
2026-07-06 23:47 ` Sean Christopherson
2026-07-06 23:54 ` Edgecombe, Rick P
2026-07-07 0:25 ` Sean Christopherson
2026-07-07 6:54 ` Chao Gao
2026-07-08 9:13 ` Yan Zhao
2026-05-26 2:35 ` [PATCH v6 08/11] x86/tdx: Add APIs to support Dynamic PAMT ops from KVM's fault path Rick Edgecombe
2026-06-04 17:11 ` Kiryl Shutsemau
2026-07-02 9:32 ` Binbin Wu
2026-07-07 7:25 ` Chao Gao
2026-05-26 2:35 ` [PATCH v6 09/11] KVM: TDX: Get/put PAMT pages when (un)mapping private memory Rick Edgecombe
2026-07-03 3:15 ` Binbin Wu
2026-07-06 20:47 ` Edgecombe, Rick P
2026-07-06 21:02 ` Sean Christopherson
2026-07-06 21:52 ` Edgecombe, Rick P
2026-07-08 8:35 ` Chao Gao
2026-05-26 2:35 ` [PATCH v6 10/11] x86/virt/tdx: Enable Dynamic PAMT Rick Edgecombe
2026-06-04 17:14 ` Kiryl Shutsemau
2026-06-05 5:25 ` Chao Gao
2026-07-01 1:20 ` Edgecombe, Rick P
2026-07-06 20:48 ` Edgecombe, Rick P
2026-07-03 4:35 ` Binbin Wu
2026-05-26 2:35 ` [PATCH v6 11/11] Documentation/x86: Add documentation for TDX's " Rick Edgecombe
2026-07-03 4:54 ` Binbin Wu
2026-06-08 5:45 ` [PATCH v6 00/11] " Tony Lindgren
2026-07-06 21:01 ` Edgecombe, Rick P
2026-07-07 16:17 ` Sean Christopherson
2026-07-07 17:25 ` Edgecombe, Rick P
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7d39a92a-0555-41cb-91dd-96dace318dcf@intel.com \
--to=sohil.mehta@intel.com \
--cc=bp@alien8.de \
--cc=chao.gao@intel.com \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=kai.huang@intel.com \
--cc=kas@kernel.org \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nik.borisov@suse.com \
--cc=pbonzini@redhat.com \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=tglx@kernel.org \
--cc=vannapurve@google.com \
--cc=x86@kernel.org \
--cc=yan.y.zhao@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox