[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260106102304.25211-1-yan.y.zhao@intel.com>
Date: Tue, 6 Jan 2026 18:23:04 +0800
From: Yan Zhao <yan.y.zhao@...el.com>
To: pbonzini@...hat.com,
seanjc@...gle.com
Cc: linux-kernel@...r.kernel.org,
kvm@...r.kernel.org,
x86@...nel.org,
rick.p.edgecombe@...el.com,
dave.hansen@...el.com,
kas@...nel.org,
tabba@...gle.com,
ackerleytng@...gle.com,
michael.roth@....com,
david@...nel.org,
vannapurve@...gle.com,
sagis@...gle.com,
vbabka@...e.cz,
thomas.lendacky@....com,
nik.borisov@...e.com,
pgonda@...gle.com,
fan.du@...el.com,
jun.miao@...el.com,
francescolavra.fl@...il.com,
jgross@...e.com,
ira.weiny@...el.com,
isaku.yamahata@...el.com,
xiaoyao.li@...el.com,
kai.huang@...el.com,
binbin.wu@...ux.intel.com,
chao.p.peng@...el.com,
chao.gao@...el.com,
yan.y.zhao@...el.com
Subject: [PATCH v3 17/24] KVM: TDX: Get/Put DPAMT page pair only when mapping size is 4KB
From: "Kirill A. Shutemov" <kirill.shutemov@...ux.intel.com>
Invoke tdx_pamt_{get/put}() to add/remove Dynamic PAMT page pair for guest
private memory only when the S-EPT mapping size is 4KB.
When the mapping size is greater than 4KB, static PAMT pages are used. No
need to install/uninstall extra PAMT pages dynamically.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@...ux.intel.com>
[Yan: Move level checking to callers of tdx_pamt_{get/put}()]
Signed-off-by: Yan Zhao <yan.y.zhao@...el.com>
---
v3:
- new patch
Checking for 4KB level was previously done inside tdx_pamt_{get/put}() in
DPAMT v2 [1].
Move the checking to callers of tdx_pamt_{get/put}() in KVM to avoid
introducing an extra "level" parameter to tdx_pamt_{get/put}(). This is
also because the callers that could have level > 4KB are limited in KVM,
i.e., only inside tdx_sept_{set/remove}_private_spte().
[1] https://lore.kernel.org/all/20250609191340.2051741-5-kirill.shutemov@linux.intel.com
---
arch/x86/kvm/vmx/tdx.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
index 712aaa3d45b7..c1dc1aaae49d 100644
--- a/arch/x86/kvm/vmx/tdx.c
+++ b/arch/x86/kvm/vmx/tdx.c
@@ -1722,9 +1722,11 @@ static int tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn,
WARN_ON_ONCE(!is_shadow_present_pte(mirror_spte) ||
(mirror_spte & VMX_EPT_RWX_MASK) != VMX_EPT_RWX_MASK);
- ret = tdx_pamt_get(page, &tdx->prealloc);
- if (ret)
- return ret;
+ if (level == PG_LEVEL_4K) {
+ ret = tdx_pamt_get(page, &tdx->prealloc);
+ if (ret)
+ return ret;
+ }
/*
* Ensure pre_fault_allowed is read by kvm_arch_vcpu_pre_fault_memory()
@@ -1743,7 +1745,7 @@ static int tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn,
else
ret = tdx_mem_page_add(kvm, gfn, level, pfn);
- if (ret)
+ if (ret && level == PG_LEVEL_4K)
tdx_pamt_put(page);
return ret;
@@ -1911,7 +1913,9 @@ static void tdx_sept_remove_private_spte(struct kvm *kvm, gfn_t gfn,
tdx_quirk_reset_folio(folio, folio_page_idx(folio, page),
KVM_PAGES_PER_HPAGE(level));
- tdx_pamt_put(page);
+
+ if (level == PG_LEVEL_4K)
+ tdx_pamt_put(page);
}
/*
--
2.43.2
Powered by blists - more mailing lists