mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Yan Zhao <yan.y.zhao@intel.com>
To: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
Cc: "Du, Fan" <fan.du@intel.com>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"kai.huang@intel.com" <kai.huang@intel.com>,
	"Li, Xiaoyao" <xiaoyao.li@intel.com>,
	"Hansen, Dave" <dave.hansen@intel.com>,
	"thomas.lendacky@amd.com" <thomas.lendacky@amd.com>,
	"vbabka@suse.cz" <vbabka@suse.cz>,
	"tabba@google.com" <tabba@google.com>,
	"david@kernel.org" <david@kernel.org>,
	"kas@kernel.org" <kas@kernel.org>,
	"binbin.wu@linux.intel.com" <binbin.wu@linux.intel.com>,
	"seanjc@google.com" <seanjc@google.com>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"Peng, Chao P" <chao.p.peng@intel.com>,
	"ackerleytng@google.com" <ackerleytng@google.com>,
	"michael.roth@amd.com" <michael.roth@amd.com>,
	"nik.borisov@suse.com" <nik.borisov@suse.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"sagis@google.com" <sagis@google.com>,
	"Annapurve, Vishal" <vannapurve@google.com>,
	"Chen, Farrah" <farrah.chen@intel.com>,
	"Gao, Chao" <chao.gao@intel.com>,
	"francescolavra.fl@gmail.com" <francescolavra.fl@gmail.com>,
	"Miao, Jun" <jun.miao@intel.com>,
	"jgross@suse.com" <jgross@suse.com>,
	"pgonda@google.com" <pgonda@google.com>,
	"x86@kernel.org" <x86@kernel.org>
Subject: Re: [PATCH v4 02/17] x86/virt/tdx: Add a SEAMCALL wrapper to demote a 2MB huge page
Date: Fri, 23 Oct 2026 16:12:08 +0800	[thread overview]
Message-ID: <atsW2OJJXUPEKh5L@yzhao56-desk.sh.intel.com> (raw)
In-Reply-To: <830974c6774c59048c04e1cdf7b7b007a40f97db.camel@intel.com>

On Thu, Oct 22, 2026 at 11:51:48PM +0800, Edgecombe, Rick P wrote:
> On Thu, 2026-10-22 at 16:46 +0800, Yan Zhao wrote:
> > u64 tdh_mem_page_demote_2mb(struct tdx_td *td, u64 gpa, kvm_pfn_t pfn, struct
> > page *new_sept_pt,
> >                             struct tdx_pamt_cache *pamt_cache, u64 *ext_err1,
> > u64 *ext_err2)
> > {
> >         struct tdx_module_args args = {
> >                 .rcx = gpa | pg_level_to_tdx_sept_level(PG_LEVEL_2M),
> >                 .rdx = tdx_tdr_pa(td),
> >                 .r8 = page_to_phys(new_sept_pt),
> >         };
> >         struct page *dpamt_pages[TDX_DPAMT_ENTRY_PAGE_CNT];
> >         atomic_t *dpamt_refcount;
> >         u64 ret;
> > 
> >         /*
> >          * For implementation simplicity, only support demotion when
> >          * DPAMT is enabled.
> >          */
> >         WARN_ON_ONCE(!tdx_supports_dynamic_pamt(&tdx_sysinfo));
> > 
> >         /* A NULL pamt_cache is unexpected, so failure indicates a software
> > error */
> 
> On the edge of unnecessary to me, but ok.
I'll remove this comment then :)

> >         ret = alloc_pamt_array(dpamt_pages, pamt_cache);
> >         if (ret) {
> >                 *ext_err1 = 0;
> >                 *ext_err2 = 0;
> >                 return TDX_SW_ERROR;
> >         }
> > 
> >         dpamt_refcount = tdx_find_dpamt_refcount(pfn);
> > 
> >         args.r12 = page_to_phys(dpamt_pages[0]);
> >         args.r13 = page_to_phys(dpamt_pages[1]);
> > 
> >         /*
> >          * The dpamt_lock is used to avoid contention between the
> >          * TDH_MEM_PAGE_DEMOTE and TDH_PHYMEM_PAMT_{ADD/REMOVE} SEAMCALLs.
> >          */
> >         spin_lock(&dpamt_lock);
> > 
> >         ret = seamcall_saved_ret(TDH_MEM_PAGE_DEMOTE, &args);
> >         *ext_err1 = args.rcx;
> >         *ext_err2 = args.rdx;
> > 
> >         if (WARN_ON_ONCE(ret != TDX_SUCCESS))
> >                 goto out_free;
> > 
> >         atomic_set(dpamt_refcount, PTRS_PER_PMD);
> >         spin_unlock(&dpamt_lock);
> > 
> >         return TDX_SUCCESS;
> > 
> > out_free:
> >         spin_unlock(&dpamt_lock);
> >         free_pamt_array(pamt_cache, dpamt_pages);
> > 
> >         return ret;
> > }
> 
> LGTM
Oops, I accidentally included changes for the workaround for a TDX module that
does not support uninterruptible demote, and forgot that the busy error is valid.

Could you please check if the following version looks good to you?
Changes vs the last version:
- Added WARN on !tdx_huge_page_demote_uninterruptible() and updated the comment
  above the warning.
- Do not warn on TDX_OPERAND_BUSY.
- Removed the comment above alloc_pamt_array().

Thanks a lot!

u64 tdh_mem_page_demote_2mb(struct tdx_td *td, u64 gpa, kvm_pfn_t pfn,
			    struct page *new_pt, struct tdx_pamt_cache *pamt_cache,
			    u64 *ext_err1, u64 *ext_err2)
{
	struct tdx_module_args args = {
		.rcx = gpa | pg_level_to_tdx_sept_level(PG_LEVEL_2M),
		.rdx = tdx_tdr_pa(td),
		.r8 = page_to_phys(new_pt),
	};
	struct page *dpamt_pages[TDX_DPAMT_ENTRY_PAGE_CNT];
	atomic_t *dpamt_refcount;
	u64 ret;

	/*
	 * For simplicity, only support demotion when DPAMT is enabled and when the
	 * TDH_MEM_PAGE_DEMOTE SEAMCALL does not return TDX_INTERRUPTED_RESTARTABLE.
	 */
	WARN_ON_ONCE(!tdx_huge_page_demote_uninterruptible(&tdx_sysinfo) ||
		     !tdx_supports_dynamic_pamt(&tdx_sysinfo));

	if (alloc_pamt_array(dpamt_pages, pamt_cache)) {
		*ext_err1 = 0;
		*ext_err2 = 0;
		return TDX_SW_ERROR;
	}

	dpamt_refcount = tdx_find_dpamt_refcount(pfn);

	args.r12 = page_to_phys(dpamt_pages[0]);
	args.r13 = page_to_phys(dpamt_pages[1]);

	/*
	 * The dpamt_lock is used to avoid contention between the
	 * TDH_MEM_PAGE_DEMOTE and TDH_PHYMEM_PAMT_{ADD/REMOVE} SEAMCALLs.
	 */
	spin_lock(&dpamt_lock);

	ret = seamcall_saved_ret(TDH_MEM_PAGE_DEMOTE, &args);
	*ext_err1 = args.rcx;
	*ext_err2 = args.rdx;

	if (ret != TDX_SUCCESS) {
		WARN_ON_ONCE((ret & TDX_SEAMCALL_STATUS_MASK) != TDX_OPERAND_BUSY);
		goto out_free;
	}

	atomic_set(dpamt_refcount, PTRS_PER_PMD);
	spin_unlock(&dpamt_lock);

	return TDX_SUCCESS;

out_free:
	spin_unlock(&dpamt_lock);
	free_pamt_array(pamt_cache, dpamt_pages);
	return ret;
}
EXPORT_SYMBOL_FOR_KVM(tdh_mem_page_demote_2mb);




  reply	other threads:[~2026-10-23  8:13 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-28  9:07 [PATCH v4 00/17] KVM: TDX huge page support for private memory Yan Zhao
2026-09-28  9:08 ` [PATCH v4 01/17] x86/virt/tdx: Enhance tdx_pamt_get/put() to support huge pages Yan Zhao
2026-10-01 23:02   ` Edgecombe, Rick P
2026-10-10 10:18     ` Yan Zhao
2026-10-12 23:18       ` Edgecombe, Rick P
2026-10-15  3:41         ` Yan Zhao
2026-10-15 18:11           ` Edgecombe, Rick P
2026-10-19  6:35             ` Yan Zhao
2026-10-21 21:28               ` Edgecombe, Rick P
2026-10-22  9:21                 ` Yan Zhao
2026-09-28  9:08 ` [PATCH v4 02/17] x86/virt/tdx: Add a SEAMCALL wrapper to demote a 2MB huge page Yan Zhao
2026-10-02  0:54   ` Edgecombe, Rick P
2026-10-12  9:31     ` Yan Zhao
2026-10-12 22:16       ` Edgecombe, Rick P
2026-10-14  9:40         ` Yan Zhao
2026-10-14 18:32           ` Edgecombe, Rick P
2026-10-15  6:11             ` Yan Zhao
2026-10-15  9:28               ` Yan Zhao
2026-10-15  9:49                 ` Yan Zhao
2026-10-15 18:30                   ` Edgecombe, Rick P
2026-10-19 11:04                     ` Yan Zhao
2026-10-21 22:02                       ` Edgecombe, Rick P
2026-10-22  8:46                         ` Yan Zhao
2026-10-22 15:51                           ` Edgecombe, Rick P
2026-10-23  8:12                             ` Yan Zhao [this message]
2026-09-28  9:08 ` [PATCH v4 03/17] KVM: TDX: Reset private huge pages after S-EPT page removal Yan Zhao
2026-10-07  0:06   ` Edgecombe, Rick P
2026-10-10  9:22     ` Yan Zhao
2026-09-28  9:09 ` [PATCH v4 04/17] KVM: x86/mmu: Prevent huge page promotion for mirror roots in fault path Yan Zhao
2026-10-07  0:32   ` Edgecombe, Rick P
2026-09-28  9:09 ` [PATCH v4 05/17] KVM: x86/tdp_mmu: Alloc external_spt page for mirror page table splitting Yan Zhao
2026-10-07  0:33   ` Edgecombe, Rick P
2026-10-10  7:41     ` Yan Zhao
2026-09-28  9:10 ` [PATCH v4 06/17] KVM: x86/mmu: Allocate DPAMT pages for vCPU-induced page split Yan Zhao
2026-10-07 15:45   ` Edgecombe, Rick P
2026-10-10  6:37     ` Yan Zhao
2026-10-10  6:40       ` Yan Zhao
2026-10-12 16:41       ` Edgecombe, Rick P
2026-09-28  9:10 ` [PATCH v4 07/17] KVM: TDX: Add core support for splitting/demoting 2MB S-EPT mappings to 4KB Yan Zhao
2026-10-07 21:52   ` Edgecombe, Rick P
2026-10-10  6:34     ` Yan Zhao
2026-10-12 16:40       ` Edgecombe, Rick P
2026-10-14  5:39         ` Yan Zhao
2026-09-28  9:10 ` [PATCH v4 08/17] KVM: TDX: Adjust the topup count of DPAMT page pairs for splitting S-EPT Yan Zhao
2026-10-07 22:48   ` Edgecombe, Rick P
2026-10-08  1:16     ` Edgecombe, Rick P
2026-10-09  9:08       ` Yan Zhao
2026-10-09 22:12         ` Edgecombe, Rick P
2026-10-10  5:13           ` Yan Zhao
2026-10-12 16:36             ` Edgecombe, Rick P
2026-10-14  5:36               ` Yan Zhao
2026-10-14 18:34                 ` Edgecombe, Rick P
2026-10-15  4:47                   ` Yan Zhao
2026-10-15 17:21                     ` Edgecombe, Rick P
2026-10-19  1:59                       ` Yan Zhao
2026-10-21 22:28                         ` Edgecombe, Rick P
2026-10-22  7:24                           ` Yan Zhao
2026-10-22 15:56                             ` Edgecombe, Rick P
2026-10-22 23:59                               ` Yan Zhao
2026-10-23  1:20                                 ` Yan Zhao
2026-10-23  1:56                                 ` Edgecombe, Rick P
2026-10-23  2:03                                   ` Yan Zhao
2026-10-23  2:06                                     ` Edgecombe, Rick P
2026-10-23  2:12                                       ` Yan Zhao
2026-10-23  2:15                                         ` Edgecombe, Rick P
2026-10-09  8:39     ` Yan Zhao
2026-10-09 22:11       ` Edgecombe, Rick P
2026-10-10  5:18         ` Yan Zhao
2026-09-28  9:10 ` [PATCH v4 09/17] KVM: x86/mmu: Introduce hugepage_set_guest_inhibit() Yan Zhao
2026-10-07 23:57   ` Edgecombe, Rick P
2026-10-10  6:00     ` Yan Zhao
2026-09-28  9:11 ` [PATCH v4 10/17] KVM: x86/mmu: Add a TDP MMU API to split huge pages for mirror roots Yan Zhao
2026-10-08  0:25   ` Edgecombe, Rick P
2026-09-28  9:11 ` [PATCH v4 11/17] KVM: TDX: Honor the guest's accept level contained in an EPT violation Yan Zhao
2026-10-08  1:05   ` Edgecombe, Rick P
2026-10-09  9:33     ` Yan Zhao
2026-10-09 22:00       ` Edgecombe, Rick P
2026-10-10  5:42         ` Yan Zhao
2026-10-12 16:14           ` Edgecombe, Rick P
2026-09-28  9:11 ` [PATCH v4 12/17] KVM: x86/mmu: Add support for splitting S-EPT entry under non-vCPU context Yan Zhao
2026-09-28  9:11 ` [PATCH v4 13/17] [GMEM-DEPENDENT] KVM: guest_memfd: Add helpers to get start/end gfns give gmem+slot+pgoff Yan Zhao
2026-10-08 23:16   ` Edgecombe, Rick P
2026-09-28  9:11 ` [PATCH v4 14/17] [GMEM-DEPENDENT] KVM: guest_memfd: Split kvm_gmem_invalidate_start() to start() and zap() Yan Zhao
2026-09-28  9:12 ` [PATCH v4 15/17] [GMEM-DEPENDENT] KVM: guest_memfd: Add a pre-zap hook .gmem_prezap() Yan Zhao
2026-10-14  7:01   ` Yan Zhao
2026-09-28  9:12 ` [PATCH v4 16/17] [GMEM-DEPENDENT] KVM: TDX: Implement .gmem_prezap() hook to split S-EPT Yan Zhao
2026-09-28  9:12 ` [PATCH v4 17/17] KVM: TDX: Turn on PG_LEVEL_2M Yan Zhao

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=atsW2OJJXUPEKh5L@yzhao56-desk.sh.intel.com \
    --to=yan.y.zhao@intel.com \
    --cc=ackerleytng@google.com \
    --cc=binbin.wu@linux.intel.com \
    --cc=chao.gao@intel.com \
    --cc=chao.p.peng@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=david@kernel.org \
    --cc=fan.du@intel.com \
    --cc=farrah.chen@intel.com \
    --cc=francescolavra.fl@gmail.com \
    --cc=jgross@suse.com \
    --cc=jun.miao@intel.com \
    --cc=kai.huang@intel.com \
    --cc=kas@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michael.roth@amd.com \
    --cc=nik.borisov@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=pgonda@google.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=sagis@google.com \
    --cc=seanjc@google.com \
    --cc=tabba@google.com \
    --cc=thomas.lendacky@amd.com \
    --cc=vannapurve@google.com \
    --cc=vbabka@suse.cz \
    --cc=x86@kernel.org \
    --cc=xiaoyao.li@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

all inboxes | Powered by JetHome®