From: Binbin Wu <binbin.wu@linux.intel.com>
To: Rick Edgecombe <rick.p.edgecombe@intel.com>
Cc: bp@alien8.de, chao.gao@intel.com, dave.hansen@intel.com,
isaku.yamahata@intel.com, kai.huang@intel.com, kas@kernel.org,
kvm@vger.kernel.org, linux-coco@lists.linux.dev,
linux-kernel@vger.kernel.org, mingo@redhat.com,
pbonzini@redhat.com, seanjc@google.com, tglx@linutronix.de,
vannapurve@google.com, x86@kernel.org, yan.y.zhao@intel.com,
xiaoyao.li@intel.com, binbin.wu@intel.com
Subject: Re: [PATCH v4 12/16] x86/virt/tdx: Add helpers to allow for pre-allocating pages
Date: Wed, 26 Nov 2025 11:40:09 +0800 [thread overview]
Message-ID: <7a6f5b4e-ad7b-4ad0-95fd-e1698f9b4e06@linux.intel.com> (raw)
In-Reply-To: <20251121005125.417831-13-rick.p.edgecombe@intel.com>
On 11/21/2025 8:51 AM, Rick Edgecombe wrote:
> In the KVM fault path page, tables and private pages need to be
"In the KVM fault path page, tables ..." should be
"In the KVM fault path, page tables ..."
> installed under a spin lock. This means that the operations around
> installing PAMT pages for them will not be able to allocate pages.
>
[...]
> @@ -141,7 +142,46 @@ int tdx_guest_keyid_alloc(void);
> u32 tdx_get_nr_guest_keyids(void);
> void tdx_guest_keyid_free(unsigned int keyid);
>
> -int tdx_pamt_get(struct page *page);
> +int tdx_dpamt_entry_pages(void);
> +
> +/*
> + * Simple structure for pre-allocating Dynamic
> + * PAMT pages outside of locks.
It's not just for Dynamic PAMT pages, but also external page table pages.
> + */
> +struct tdx_prealloc {
> + struct list_head page_list;
> + int cnt;
> +};
> +
> +static inline struct page *get_tdx_prealloc_page(struct tdx_prealloc *prealloc)
> +{
> + struct page *page;
> +
> + page = list_first_entry_or_null(&prealloc->page_list, struct page, lru);
> + if (page) {
> + list_del(&page->lru);
> + prealloc->cnt--;
> + }
> +
> + return page;
> +}
> +
> +static inline int topup_tdx_prealloc_page(struct tdx_prealloc *prealloc, unsigned int min_size)
> +{
> + while (prealloc->cnt < min_size) {
> + struct page *page = alloc_page(GFP_KERNEL_ACCOUNT);
> +
> + if (!page)
> + return -ENOMEM;
> +
> + list_add(&page->lru, &prealloc->page_list);
> + prealloc->cnt++;
> + }
> +
> + return 0;
> +}
> +
> +int tdx_pamt_get(struct page *page, struct tdx_prealloc *prealloc);
> void tdx_pamt_put(struct page *page);
>
> struct page *tdx_alloc_page(void);
> @@ -219,6 +259,7 @@ static inline int tdx_enable(void) { return -ENODEV; }
> static inline u32 tdx_get_nr_guest_keyids(void) { return 0; }
> static inline const char *tdx_dump_mce_info(struct mce *m) { return NULL; }
> static inline const struct tdx_sys_info *tdx_get_sysinfo(void) { return NULL; }
> +static inline int tdx_dpamt_entry_pages(void) { return 0; }
> #endif /* CONFIG_INTEL_TDX_HOST */
>
> #ifdef CONFIG_KEXEC_CORE
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 260bb0e6eb44..61a058a8f159 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -1644,23 +1644,34 @@ static int tdx_mem_page_add(struct kvm *kvm, gfn_t gfn, enum pg_level level,
>
> static void *tdx_alloc_external_fault_cache(struct kvm_vcpu *vcpu)
> {
> - struct vcpu_tdx *tdx = to_tdx(vcpu);
> + struct page *page = get_tdx_prealloc_page(&to_tdx(vcpu)->prealloc);
>
> - return kvm_mmu_memory_cache_alloc(&tdx->mmu_external_spt_cache);
> + if (WARN_ON_ONCE(!page))
> + return (void *)__get_free_page(GFP_ATOMIC | __GFP_ACCOUNT);
kvm_mmu_memory_cache_alloc() calls BUG_ON() if the atomic allocation failed.
Do we want to follow?
> +
> + return page_address(page);
> }
>
> static int tdx_topup_external_fault_cache(struct kvm_vcpu *vcpu, unsigned int cnt)
> {
> - struct vcpu_tdx *tdx = to_tdx(vcpu);
> + struct tdx_prealloc *prealloc = &to_tdx(vcpu)->prealloc;
> + int min_fault_cache_size;
>
> - return kvm_mmu_topup_memory_cache(&tdx->mmu_external_spt_cache, cnt);
> + /* External page tables */
> + min_fault_cache_size = cnt;
> + /* Dynamic PAMT pages (if enabled) */
> + min_fault_cache_size += tdx_dpamt_entry_pages() * PT64_ROOT_MAX_LEVEL;
Is the value PT64_ROOT_MAX_LEVEL intended, since dynamic PAMT pages are only
needed for 4KB level?
> +
> + return topup_tdx_prealloc_page(prealloc, min_fault_cache_size);
> }
>
>
[...]
next prev parent reply other threads:[~2025-11-26 3:40 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-21 0:51 [PATCH v4 00/16] TDX: Enable Dynamic PAMT Rick Edgecombe
2025-11-21 0:51 ` [PATCH v4 01/16] x86/tdx: Move all TDX error defines into <asm/shared/tdx_errno.h> Rick Edgecombe
2025-11-25 22:30 ` Huang, Kai
2025-11-25 22:44 ` Huang, Kai
2025-11-26 23:15 ` Edgecombe, Rick P
2025-11-26 23:14 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 02/16] x86/tdx: Add helpers to check return status codes Rick Edgecombe
2025-11-24 8:56 ` Binbin Wu
2025-11-24 19:31 ` Edgecombe, Rick P
2025-11-25 23:07 ` Huang, Kai
2025-11-26 23:26 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 03/16] x86/virt/tdx: Simplify tdmr_get_pamt_sz() Rick Edgecombe
2025-11-24 9:26 ` Binbin Wu
2025-11-24 19:47 ` Edgecombe, Rick P
2025-11-25 1:27 ` Binbin Wu
2025-11-21 0:51 ` [PATCH v4 04/16] x86/virt/tdx: Allocate page bitmap for Dynamic PAMT Rick Edgecombe
2025-11-25 1:50 ` Binbin Wu
2025-11-26 17:56 ` Edgecombe, Rick P
2025-12-24 9:10 ` Xu Yilun
2026-01-05 22:06 ` Edgecombe, Rick P
2026-01-06 4:01 ` Xu Yilun
2026-01-06 17:00 ` Edgecombe, Rick P
2026-01-07 6:01 ` Xu Yilun
2026-01-07 14:41 ` Edgecombe, Rick P
2026-01-08 12:53 ` Xu Yilun
2026-01-08 16:52 ` Edgecombe, Rick P
2026-01-09 2:18 ` Xu Yilun
2026-01-09 16:05 ` Edgecombe, Rick P
2026-01-12 0:24 ` Xu Yilun
2025-11-21 0:51 ` [PATCH v4 05/16] x86/virt/tdx: Allocate reference counters for PAMT memory Rick Edgecombe
2025-11-21 0:51 ` [PATCH v4 06/16] x86/virt/tdx: Improve PAMT refcounts allocation for sparse memory Rick Edgecombe
2025-11-25 3:15 ` Binbin Wu
2025-11-26 20:47 ` Edgecombe, Rick P
2025-11-27 15:57 ` Kiryl Shutsemau
2025-12-01 22:14 ` Edgecombe, Rick P
2025-11-26 14:45 ` Nikolay Borisov
2025-11-26 20:47 ` Edgecombe, Rick P
2025-11-27 7:36 ` Nikolay Borisov
2025-12-11 0:07 ` Edgecombe, Rick P
2025-11-27 16:04 ` Kiryl Shutsemau
2025-11-21 0:51 ` [PATCH v4 07/16] x86/virt/tdx: Add tdx_alloc/free_page() helpers Rick Edgecombe
2025-11-25 8:09 ` Binbin Wu
2025-11-26 22:28 ` Edgecombe, Rick P
2026-01-29 1:19 ` Sean Christopherson
2026-01-29 17:18 ` Edgecombe, Rick P
2026-01-29 19:09 ` Sean Christopherson
2026-01-29 19:12 ` Edgecombe, Rick P
2025-11-26 1:21 ` Huang, Kai
2025-11-26 22:28 ` Edgecombe, Rick P
2025-11-27 12:29 ` Nikolay Borisov
2025-12-01 22:31 ` Edgecombe, Rick P
2025-11-27 16:11 ` Nikolay Borisov
2025-12-01 22:39 ` Edgecombe, Rick P
2025-12-02 7:38 ` Nikolay Borisov
2025-12-02 20:02 ` Edgecombe, Rick P
2025-12-03 13:46 ` Kiryl Shutsemau
2025-12-03 13:48 ` Nikolay Borisov
2025-12-03 15:41 ` Dave Hansen
2025-12-03 18:15 ` Edgecombe, Rick P
2025-12-03 18:21 ` Dave Hansen
2025-12-03 19:59 ` Edgecombe, Rick P
2025-12-03 20:13 ` Dave Hansen
2025-12-03 21:39 ` Edgecombe, Rick P
2025-12-03 21:40 ` Dave Hansen
2025-12-08 9:15 ` Yan Zhao
2025-12-08 20:27 ` Edgecombe, Rick P
2026-01-16 23:17 ` Sean Christopherson
2026-01-16 23:25 ` Edgecombe, Rick P
2026-01-16 23:40 ` Dave Hansen
2025-11-21 0:51 ` [PATCH v4 08/16] x86/virt/tdx: Optimize " Rick Edgecombe
2025-11-21 0:51 ` [PATCH v4 09/16] KVM: TDX: Allocate PAMT memory for TD control structures Rick Edgecombe
2025-11-25 9:11 ` Binbin Wu
2025-11-21 0:51 ` [PATCH v4 10/16] KVM: TDX: Allocate PAMT memory for vCPU " Rick Edgecombe
2025-11-25 9:14 ` Binbin Wu
2025-11-21 0:51 ` [PATCH v4 11/16] KVM: TDX: Add x86 ops for external spt cache Rick Edgecombe
2026-01-17 0:53 ` Sean Christopherson
2026-01-19 2:31 ` Yan Zhao
2026-01-20 8:42 ` Huang, Kai
2026-01-20 9:18 ` Yan Zhao
2026-01-20 10:00 ` Huang, Kai
2026-01-20 19:53 ` Edgecombe, Rick P
2026-01-21 22:12 ` Sean Christopherson
2026-01-21 22:34 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 12/16] x86/virt/tdx: Add helpers to allow for pre-allocating pages Rick Edgecombe
2025-11-26 3:40 ` Binbin Wu [this message]
2025-11-26 5:21 ` Binbin Wu
2025-11-26 22:33 ` Edgecombe, Rick P
2025-11-27 2:38 ` Binbin Wu
2026-01-20 7:10 ` Huang, Kai
2026-01-20 7:46 ` Yan Zhao
2026-01-20 8:01 ` Huang, Kai
2026-01-17 1:02 ` Sean Christopherson
2026-01-21 0:52 ` Sean Christopherson
2026-01-21 0:58 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 13/16] KVM: TDX: Handle PAMT allocation in fault path Rick Edgecombe
2025-11-26 5:56 ` Binbin Wu
2025-11-26 22:33 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 14/16] KVM: TDX: Reclaim PAMT memory Rick Edgecombe
2025-11-26 8:53 ` Binbin Wu
2025-11-26 22:58 ` Edgecombe, Rick P
2025-11-21 0:51 ` [PATCH v4 15/16] x86/virt/tdx: Enable Dynamic PAMT Rick Edgecombe
2025-11-21 0:51 ` [PATCH v4 16/16] Documentation/x86: Add documentation for TDX's " Rick Edgecombe
2025-11-26 10:33 ` Binbin Wu
2025-11-26 20:05 ` Edgecombe, Rick P
2025-11-24 20:18 ` [PATCH v4 00/16] TDX: Enable " Sagi Shahar
2025-11-25 20:19 ` Vishal Annapurve
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=7a6f5b4e-ad7b-4ad0-95fd-e1698f9b4e06@linux.intel.com \
--to=binbin.wu@linux.intel.com \
--cc=binbin.wu@intel.com \
--cc=bp@alien8.de \
--cc=chao.gao@intel.com \
--cc=dave.hansen@intel.com \
--cc=isaku.yamahata@intel.com \
--cc=kai.huang@intel.com \
--cc=kas@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=vannapurve@google.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.