All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Rick Edgecombe" <rick.p.edgecombe@intel.com>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH v9 08/11] KVM: TDX: Get/put PAMT pages when (un)mapping private memory
Date: Thu, 06 Aug 2026 07:16:20 +0000	[thread overview]
Message-ID: <20260806071621.3EACF1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260806020850.1221381-9-rick.p.edgecombe@intel.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Critical] Transient TDX_OPERAND_BUSY errors during private memory mapping cause KVM to indefinitely retry the fault without restocking vCPU memory caches, leading to cache depletion and deterministic VM or host crash.
--

--- Patch [8]: [PATCH v9 08/11] KVM: TDX: Get/put PAMT pages when (un)mapping private memory ---
commit caefd7119dad264568b4b1abac0ec41595539508
Author: Kiryl Shutsemau <kas@kernel.org>
Subject: KVM: TDX: Get/put PAMT pages when (un)mapping private memory

This patch adds Dynamic PAMT support to KVM's S-EPT MMU by getting a PAMT
page when adding guest memory, and putting the page when removing it.
The kernel supplies the TDX module with a few pages that cover 2MB of host
physical memory.

> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 957078e8656ef..09573112540e9 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c

> [ ... ]

> @@ -1679,16 +1694,28 @@ static struct page *tdx_spte_to_sept_pt(struct kvm *kvm, gfn_t gfn,
>  static int tdx_sept_map_nonleaf_spte(struct kvm *kvm, gfn_t gfn,
>  				     enum pg_level level, u64 new_spte)
>  {
> +	struct kvm_vcpu *vcpu = kvm_get_running_vcpu();
>  	gpa_t gpa = gfn_to_gpa(gfn);
>  	u64 err, entry, level_state;
>  	struct page *sept_pt;
> +	int ret;
> +
> +	if (KVM_BUG_ON(!vcpu, kvm))
> +		return -EIO;
>  
>  	sept_pt = tdx_spte_to_sept_pt(kvm, gfn, new_spte, level);
>  	if (!sept_pt)
>  		return -EIO;
>  
> +	ret = tdx_pamt_get(page_to_pfn(sept_pt), &to_tdx(vcpu)->pamt_cache);
> +	if (KVM_BUG_ON(ret, kvm))
> +		return ret;
> +
>  	err = tdh_mem_sept_add(&to_kvm_tdx(kvm)->td, gpa, level, sept_pt,
>  			       &entry, &level_state);
> +	if (err)
> +		tdx_pamt_put(page_to_pfn(sept_pt));
> +

[Severity: Critical]
When tdh_mem_sept_add() returns an error like TDX_OPERAND_BUSY, this path
calls tdx_pamt_put(), which frees the page back to the global allocator
instead of returning it to the vCPU cache.

Since a busy error returns -EBUSY and triggers a RET_PF_RETRY loop in
kvm_tdp_mmu_map_private_pfn():

kvm_tdp_mmu_map_private_pfn() {
    ...
    do {
        ...
        r = kvm_tdp_mmu_map(vcpu, &fault);
    } while (r == RET_PF_RETRY);
    ...
}

Does this repeatedly drain the vCPU's memory cache without topping it up?

The loop re-attempts the mapping without calling mmu_topup_memory_caches(),
meaning repeated contentions could quickly exhaust the cache capacity.

>  	if (unlikely(tdx_operand_busy(err)))
>  		return -EBUSY;
>  
> [ ... ]
> @@ -1701,8 +1728,13 @@ static int tdx_sept_map_nonleaf_spte(struct kvm *kvm, gfn_t gfn,
>  static int tdx_sept_map_leaf_spte(struct kvm *kvm, gfn_t gfn, enum pg_level level,
>  				  u64 new_spte)
>  {
> +	struct kvm_vcpu *vcpu = kvm_get_running_vcpu();
>  	struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
>  	kvm_pfn_t pfn = spte_to_pfn(new_spte);
> +	int ret;
> +
> +	if (KVM_BUG_ON(!vcpu, kvm))
> +		return -EIO;
>  
>  	/* TODO: handle large pages. */
>  	if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
> @@ -1710,6 +1742,10 @@ static int tdx_sept_map_leaf_spte(struct kvm *kvm, gfn_t gfn, enum pg_level leve
>  
>  	WARN_ON_ONCE((new_spte & VMX_EPT_RWX_MASK) != VMX_EPT_RWX_MASK);
>  
> +	ret = tdx_pamt_get(pfn, &to_tdx(vcpu)->pamt_cache);
> +	if (KVM_BUG_ON(ret, kvm))
> +		return ret;
> +

[Severity: Critical]
If the vCPU's pamt_cache is exhausted due to the retry loop mentioned above,
tdx_pamt_get() will return -ENOMEM.

Does this KVM_BUG_ON() trigger when the cache depletes, permanently killing
the VM?

Could a busy guest intentionally induce TDX_OPERAND_BUSY contentions by
performing memory operations simultaneously with TDH.VP.ENTER on other vCPUs
to reliably trigger this crash?

>  	/*
>  	 * Ensure pre_fault_allowed is read by kvm_arch_vcpu_pre_fault_memory()
>  	 * before kvm_tdx->state.  Userspace must not be allowed to pre-fault

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260806020850.1221381-1-rick.p.edgecombe@intel.com?part=8

  reply	other threads:[~2026-08-06  7:16 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-06  2:08 [PATCH v9 00/11] Dynamic PAMT Rick Edgecombe
2026-08-06  2:08 ` [PATCH v9 01/11] x86/virt/tdx: Simplify PAMT layout calculation Rick Edgecombe
2026-08-06 20:58   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 02/11] x86/virt/tdx: Allocate page bitmap for Dynamic PAMT Rick Edgecombe
2026-08-06 20:58   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 03/11] x86/virt/tdx: Add tdx_alloc/free_control_page() helpers Rick Edgecombe
2026-08-06 17:17   ` Dave Hansen
2026-08-06 17:20     ` Dave Hansen
2026-08-06 22:22     ` Edgecombe, Rick P
2026-08-06 22:42       ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 04/11] x86/virt/tdx: Allocate refcounts for Dynamic PAMT memory Rick Edgecombe
2026-08-06  2:21   ` sashiko-bot
2026-08-06 22:02     ` Edgecombe, Rick P
2026-08-06 22:09       ` Dave Hansen
2026-08-06 20:56   ` Dave Hansen
2026-08-06 21:56     ` Edgecombe, Rick P
2026-08-06  2:08 ` [PATCH v9 05/11] x86/virt/tdx: Handle multiple callers in tdx_pamt_get/put() Rick Edgecombe
2026-08-06 22:17   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 06/11] KVM: TDX: Allocate PAMT memory for TD and vCPU control structures Rick Edgecombe
2026-08-06 22:19   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 07/11] x86/tdx: Add APIs to support Dynamic PAMT ops from KVM's fault path Rick Edgecombe
2026-08-06 22:19   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 08/11] KVM: TDX: Get/put PAMT pages when (un)mapping private memory Rick Edgecombe
2026-08-06  7:16   ` sashiko-bot [this message]
2026-08-06 21:54     ` Edgecombe, Rick P
2026-08-06 23:48   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 09/11] x86/virt/tdx: Enable Dynamic PAMT Rick Edgecombe
2026-08-10 13:57   ` Dave Hansen
2026-08-10 21:33     ` Edgecombe, Rick P
2026-08-06  2:08 ` [PATCH v9 10/11] Documentation/x86: Add documentation for TDX's " Rick Edgecombe
2026-08-10 14:08   ` Dave Hansen
2026-08-06  2:08 ` [PATCH v9 11/11] x86/virt/tdx: Optimize tdx_pamt_get/put() Rick Edgecombe
2026-08-10 14:10   ` Dave Hansen

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=20260806071621.3EACF1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=rick.p.edgecombe@intel.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.