Kernel KVM virtualization development
 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 v7 11/11] x86/virt/tdx: Optimize tdx_pamt_get/put()
Date: Sat, 18 Jul 2026 02:00:53 +0000	[thread overview]
Message-ID: <20260718020053.C2FC81F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260718014500.2231262-12-rick.p.edgecombe@intel.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Using `atomic_dec_and_lock` in `tdx_pamt_put` lacks underflow protection, causing an unbalanced put (refcount 0) to silently underflow the refcount to -1, which breaks future `tdx_pamt_get` calls for that PFN.
--

--- Patch [11]: [PATCH v7 11/11] x86/virt/tdx: Optimize tdx_pamt_get/put() ---
commit f3bde8ccf9659f8b1e1cedb9b81df0b3b209a9fa
Author: Kiryl Shutsemau <kas@kernel.org>

x86/virt/tdx: Optimize tdx_pamt_get/put()

The Dynamic PAMT get/put helpers use a global spinlock to serialize all
refcount updates and SEAMCALL invocations. This gives correct behavior for
concurrent callers, but leads to contention.

> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index 69834b0d3e602..4394bba7c9a7c 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c

[ ... ]

> @@ -2214,17 +2227,13 @@ void tdx_pamt_put(kvm_pfn_t pfn)
>  
>  	pamt_refcount = tdx_find_pamt_refcount(pfn);
>  
> -	spin_lock(&pamt_lock);
>  	/*
>  	 * If there is more than 1 reference on the pamt page, don't
>  	 * remove it yet. Just decrement the refcount.
>  	 */
> -	if (atomic_read(pamt_refcount) > 1) {
> -		atomic_dec(pamt_refcount);
> -		goto out_unlock;
> -	}
> +	if (!atomic_dec_and_lock(pamt_refcount, &pamt_lock))
> +		return;

[Severity: Medium]
If an unbalanced put occurs on an un-added PAMT page (where the refcount
is 0), does atomic_dec_and_lock() lack underflow protection and silently
drop the refcount to -1 instead of proceeding to the SEAMCALL failure
warning as the previous logic did?

lib/dec_and_lock.c:atomic_dec_and_lock() {
    /* Subtract 1 from counter unless that drops it to 0 (ie. it was 1) */
    if (atomic_add_unless(atomic, -1, 1))
        return 0;
    ...
}

If the refcount silently becomes -1, would a subsequent call to
tdx_pamt_get() for this PFN incorrectly succeed without adding the PAMT
memory?

arch/x86/virt/vmx/tdx/tdx.c:tdx_pamt_get() {
    ...
    if (atomic_inc_not_zero(pamt_refcount))
        return 0;
    ...
}

Since -1 is not zero, atomic_inc_not_zero() would increment the refcount
to 0 and return true, bypassing the tdh_phymem_pamt_add() SEAMCALL.

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

      reply	other threads:[~2026-07-18  2:00 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-18  1:44 [PATCH v7 00/11] Dynamic PAMT Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 01/11] x86/virt/tdx: Simplify PAMT layout calculation Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 02/11] x86/virt/tdx: Allocate page bitmap for Dynamic PAMT Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 03/11] x86/virt/tdx: Add tdx_alloc/free_control_page() helpers Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 04/11] x86/virt/tdx: Allocate refcounts for Dynamic PAMT memory Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 05/11] x86/virt/tdx: Handle multiple callers in tdx_pamt_get/put() Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 06/11] KVM: TDX: Allocate PAMT memory for TD and vCPU control structures Rick Edgecombe
2026-07-18  2:03   ` sashiko-bot
2026-07-18  1:44 ` [PATCH v7 07/11] x86/tdx: Add APIs to support Dynamic PAMT ops from KVM's fault path Rick Edgecombe
2026-07-18  1:44 ` [PATCH v7 08/11] KVM: TDX: Get/put PAMT pages when (un)mapping private memory Rick Edgecombe
2026-07-18  6:10   ` sashiko-bot
2026-07-18  1:44 ` [PATCH v7 09/11] x86/virt/tdx: Enable Dynamic PAMT Rick Edgecombe
2026-07-18  1:56   ` sashiko-bot
2026-07-18  1:44 ` [PATCH v7 10/11] Documentation/x86: Add documentation for TDX's " Rick Edgecombe
2026-07-18  1:45 ` [PATCH v7 11/11] x86/virt/tdx: Optimize tdx_pamt_get/put() Rick Edgecombe
2026-07-18  2:00   ` sashiko-bot [this message]

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=20260718020053.C2FC81F000E9@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox