From nobody Sun Feb 8 17:36:24 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8634A34EF0D for ; Thu, 29 Jan 2026 01:16:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649385; cv=none; b=XVlzUJddnDrZaHZ/roO8p96YiKKgy3cvrut/8z5O470MtbL/JM8s8wLgmq8uWJ/BwZnlLHuEcXiDiJoLjOTGwk6xKmdORhP9FjAR21RolclG4Sci2JDfR5dBrrVyWflGm9bl1bh+jFlJQyYFf5dBfwIVnpQmDG9ewUnhlUGqO5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649385; c=relaxed/simple; bh=E/p9aO3ZAiwSbYiHC1+ljXC/97KIVcZ8eXjeNv4DXak=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=d3mHrL5E3zX8T5XR7jOfu8qEirx8Wo+MvuxGuJGmZz5aT04FUM+a0ndhEtRkxSzjvmcytxbVKI8esd72cuS2Sb8RCxTxos/dPAtdUYqxqMZTOlMwZhqTxiohWvPkEFneh+nhmXN/O+kf7lHqMQ45eFaGF3wBEVU4RNE+fnp8KtM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=duDE11qp; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="duDE11qp" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c5291b89733so300202a12.0 for ; Wed, 28 Jan 2026 17:16:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769649383; x=1770254183; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=EhyaETaO3z5ZObA+zH7KzPZSfmMP5O9GD9W3Xs6375s=; b=duDE11qpqs9aYVpRTRY+ka1IbNyNWLwzQG6aZSHOSUDgdJDTOubv+Ts1rNPkr7RtUe e51jJXax3NeWMPYqX2qnUnU/3icXTrWMslm1ExMLnJfuC34xpX07H+SeDn3gRs9r62aK FZTNv5gJct/QHmwAyEoHzhZLS2Bk2dP91P5WfsxYzL06Khnhtt/KTlQHOuz2buVactIr lcEwqS3KUhhxU4mwnTRM3nBNm9IfyeXRo9kIRtBlEePRFRqZzFkFuG+daTmRtqDnD4dG kDJMMe2FTRTlrr2xWbPXfiAs58JDDP1L7HQySsFgnu+viEV5oWQHxaJ/ojQYKJ6j461D 4U+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769649383; x=1770254183; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=EhyaETaO3z5ZObA+zH7KzPZSfmMP5O9GD9W3Xs6375s=; b=kP4hRJ5AtPg692w5Yn+mJ9NWglDhGP4bJcnYAhpN3j+cCA2zJtC9l2x9lZVbQmXAtg zBHesmtzQCCC5c2kqRw4dJHr3n4vVUnNLMD+t8Tf8ISrFXgzxFOuzmm4uPZPrVHPeAnJ 7878MEXYvayT82JWxS5WnGd7cmvKw2Qt85p2aT8Ze4E7cMAUB41vr7+UZJEznhpSuu2K 7r3u4JbaOVjizOMpxqlNsA3Rwk8ZonHBVB6Fe4oyMgU0TJCRUYwxt0uUI97UAoz6jof6 gAF311DIb3MLNRVS+hrcZcYqEnnZ+bSY3+bYsOceQqpbs0SxJBqhywyyPbYthxy+Depx IrlQ== X-Gm-Message-State: AOJu0YyoBpI5JQ2mcala1wHZTPgh/lykudh3w5+10R+n9yjSppyLIabD Bxp8JHXdoFx3ZyyiZo4wxbapO2nul1Etb0uo3vMdJubVx5nnKMzXF5TXtiBeJoNnokO5lb5r6Hy VtRG/aw== X-Received: from pggk18.prod.google.com ([2002:a63:d112:0:b0:c5e:9fe:7560]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6300:2206:b0:350:b8e:f99b with SMTP id adf61e73a8af0-38ec64182ccmr7501037637.45.1769649382397; Wed, 28 Jan 2026 17:16:22 -0800 (PST) Reply-To: Sean Christopherson Date: Wed, 28 Jan 2026 17:15:01 -0800 In-Reply-To: <20260129011517.3545883-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260129011517.3545883-1-seanjc@google.com> X-Mailer: git-send-email 2.53.0.rc1.217.geba53bf80e-goog Message-ID: <20260129011517.3545883-30-seanjc@google.com> Subject: [RFC PATCH v5 29/45] x86/virt/tdx: Get/Put DPAMT page pair if and only if mapping size is 4KB From: Sean Christopherson To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, Kiryl Shutsemau , Sean Christopherson , Paolo Bonzini Cc: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, Kai Huang , Rick Edgecombe , Yan Zhao , Vishal Annapurve , Ackerley Tng , Sagi Shahar , Binbin Wu , Xiaoyao Li , Isaku Yamahata Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Kirill A. Shutemov Elide the guts of getting/putting a Dynamic PAMT entry when the associated mapping is greater than 4KiB, in which case static PAMT pages are used and there's no need to (un)install extra PAMT pages. Signed-off-by: Kirill A. Shutemov [Yan: Move level checking to callers of tdx_pamt_{get/put}()] Signed-off-by: Yan Zhao [sean: move level checking back to tdx_pamt_{get/put}()] Signed-off-by: Sean Christopherson --- arch/x86/include/asm/tdx.h | 16 ++++++++++++++-- arch/x86/kvm/vmx/tdx.c | 6 +++--- arch/x86/virt/vmx/tdx/tdx.c | 12 ++++++------ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index e61b0b3cc403..50feea01b066 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -154,8 +154,20 @@ static inline void tdx_init_pamt_cache(struct tdx_pamt= _cache *cache) =20 void tdx_free_pamt_cache(struct tdx_pamt_cache *cache); int tdx_topup_pamt_cache(struct tdx_pamt_cache *cache, unsigned long npage= s); -int tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *cache); -void tdx_pamt_put(u64 pfn); +int __tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *cache); +void __tdx_pamt_put(u64 pfn); + +static inline int tdx_pamt_get(u64 pfn, enum pg_level level, + struct tdx_pamt_cache *cache) +{ + return level =3D=3D PG_LEVEL_4K ? __tdx_pamt_get(pfn, cache) : 0; +} + +static inline void tdx_pamt_put(u64 pfn, enum pg_level level) +{ + if (level =3D=3D PG_LEVEL_4K) + __tdx_pamt_put(pfn); +} =20 void __tdx_quirk_reset_page(u64 pfn, enum pg_level level); =20 diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index aca556923822..bd5d902da303 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -1729,7 +1729,7 @@ static int tdx_sept_set_private_spte(struct kvm *kvm,= gfn_t gfn, =20 WARN_ON_ONCE((mirror_spte & VMX_EPT_RWX_MASK) !=3D VMX_EPT_RWX_MASK); =20 - ret =3D tdx_pamt_get(pfn, &tdx->pamt_cache); + ret =3D tdx_pamt_get(pfn, level, &tdx->pamt_cache); if (ret) return ret; =20 @@ -1751,7 +1751,7 @@ static int tdx_sept_set_private_spte(struct kvm *kvm,= gfn_t gfn, ret =3D tdx_mem_page_add(kvm, gfn, level, pfn); =20 if (ret) - tdx_pamt_put(pfn); + tdx_pamt_put(pfn, level); =20 return ret; } @@ -1872,7 +1872,7 @@ static void tdx_sept_remove_private_spte(struct kvm *= kvm, gfn_t gfn, return; =20 __tdx_quirk_reset_page(pfn, level); - tdx_pamt_put(pfn); + tdx_pamt_put(pfn, level); } =20 void tdx_deliver_interrupt(struct kvm_lapic *apic, int delivery_mode, diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 411e5feef39f..cff325fdec79 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -2195,7 +2195,7 @@ static u64 tdh_phymem_pamt_remove(u64 pfn, u64 *pamt_= pa_array) static DEFINE_SPINLOCK(pamt_lock); =20 /* Bump PAMT refcount for the given page and allocate PAMT memory if neede= d */ -int tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *cache) +int __tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *cache) { u64 pamt_pa_array[MAX_NR_DPAMT_ARGS]; atomic_t *pamt_refcount; @@ -2266,13 +2266,13 @@ int tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *ca= che) free_pamt_array(pamt_pa_array); return ret; } -EXPORT_SYMBOL_FOR_KVM(tdx_pamt_get); +EXPORT_SYMBOL_FOR_KVM(__tdx_pamt_get); =20 /* * Drop PAMT refcount for the given page and free PAMT memory if it is no * longer needed. */ -void tdx_pamt_put(u64 pfn) +void __tdx_pamt_put(u64 pfn) { u64 pamt_pa_array[MAX_NR_DPAMT_ARGS]; atomic_t *pamt_refcount; @@ -2326,7 +2326,7 @@ void tdx_pamt_put(u64 pfn) */ free_pamt_array(pamt_pa_array); } -EXPORT_SYMBOL_FOR_KVM(tdx_pamt_put); +EXPORT_SYMBOL_FOR_KVM(__tdx_pamt_put); =20 void tdx_free_pamt_cache(struct tdx_pamt_cache *cache) { @@ -2372,7 +2372,7 @@ struct page *__tdx_alloc_control_page(gfp_t gfp) if (!page) return NULL; =20 - if (tdx_pamt_get(page_to_pfn(page), NULL)) { + if (__tdx_pamt_get(page_to_pfn(page), NULL)) { __free_page(page); return NULL; } @@ -2390,7 +2390,7 @@ void __tdx_free_control_page(struct page *page) if (!page) return; =20 - tdx_pamt_put(page_to_pfn(page)); + __tdx_pamt_put(page_to_pfn(page)); __free_page(page); } EXPORT_SYMBOL_FOR_KVM(__tdx_free_control_page); --=20 2.53.0.rc1.217.geba53bf80e-goog