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
prev parent 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