From: Xu Yilun <yilun.xu@linux.intel.com>
To: x86@kernel.org, linux-coco@lists.linux.dev,
linux-kernel@vger.kernel.org
Cc: Kiryl Shutsemau <kas@kernel.org>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
dave.hansen@intel.com, kvm@vger.kernel.org, yilun.xu@intel.com,
yilun.xu@linux.intel.com, xiaoyao.li@intel.com,
sohil.mehta@intel.com, adrian.hunter@intel.com,
kishen.maloor@intel.com, tony.lindgren@linux.intel.com,
peter.fang@intel.com, baolu.lu@linux.intel.com,
zhenzhong.duan@intel.com, chao.gao@intel.com,
artem.bityutskiy@linux.intel.com, nik.borisov@suse.com
Subject: [PATCH v4 6/6] x86/virt/tdx: Re-initialize the extensions on runtime TDX module update
Date: Tue, 13 Oct 2026 23:28:56 +0800 [thread overview]
Message-ID: <20261013-tdx-module-ext-v4-6-de5ffac65470@linux.intel.com> (raw)
In-Reply-To: <20261013-tdx-module-ext-v4-0-de5ffac65470@linux.intel.com>
Runtime TDX module update introduces a mechanism to update the module
firmware while preserving and restoring TDX operations. The extensions
functionalities should also be re-initialized as part of the restoration
process.
The TDX architecture supports an update flow which allows updated
extensions to consume more memory than their original boot-time
requirement. So the arch defines the extensions re-initialization flow
the same as boot-up initialization: the host queries TDX module how much
additional memory needed, allocates it, adds it to the module via
TDH.EXT.MEM.ADD, then re-initializes the extensions via TDH.EXT.INIT.
Linux runs the updates in stop_machine() context, which prevents memory
allocation. So for Linux, a compatible update must not install updated
extensions that require additional memory.
Given that the memory for the extensions must not increase, the
re-initialization skips the memory adding steps. It is simplified as:
- Check if the extensions are supported via TDX_FEATURES0_EXT. If not,
skip the extensions re-initialization.
- Re-initialize the extensions via TDH.EXT.INIT. The SEAMCALL leaf
will fail if the updated extensions require more memory, which
indicates the update image is not compatible.
AI was used under supervision to review code and workshop logs.
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com>
Reviewed-by: Kiryl Shutsemau (Meta) <kas@kernel.org>
Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
---
v4:
- Collect Reviewed-by tags
v3:
- Add this patch back cause the latest discussion decides the
re-initialization won't be integrated in TDH.SYS.UPDATE, a dedicated
TDH.EXT.INIT call is still needed (Dave & Rick)
- Drop the ext_required check (Rick)
- Rename the reinit function as reinit_tdx_module_extensions() (Tony)
- Move the reinit function right under tdh_sys_update() (Rick)
v2:
- Removed this patch cause the TDX module is expected to re-initialize
the extensions on TDH.SYS.UPDATE
v1:
- Don't update the extensions metadata any more, only check the
metadata originated at boot time.
- Remove memory_pool_required_pages check, let TDH.EXT.INIT fail if
more memory required.
- Changelog & code comments
---
arch/x86/virt/vmx/tdx/tdx.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index f1cc0422d129..4cce77b6a31f 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -1353,7 +1353,7 @@ static __init int tdx_ext_mem_setup(void)
return ret;
}
-static __init int tdx_ext_init(void)
+static int tdx_ext_init(void)
{
struct tdx_module_args args = {};
u64 ret;
@@ -1384,6 +1384,19 @@ static __init int init_tdx_module_extensions(void)
return tdx_ext_init();
}
+/*
+ * Don't update the memory requirement metadata or try memory allocation in
+ * stop_machine(). If an incompatible update requires more memory, let the
+ * extensions re-initialization fail.
+ */
+static int reinit_tdx_module_extensions(void)
+{
+ if (!(tdx_sysinfo.features.tdx_features0 & TDX_FEATURES0_EXT))
+ return 0;
+
+ return tdx_ext_init();
+}
+
static __init int init_tdx_module(void)
{
int ret;
@@ -1567,6 +1580,10 @@ int tdx_module_run_update(void)
if (ret)
return ret;
+ ret = reinit_tdx_module_extensions();
+ if (ret)
+ return ret;
+
ret = get_tdx_sys_info_version(&tdx_sysinfo.version);
/*
* Only fails if there is something unexpected
--
2.25.1
prev parent reply other threads:[~2026-10-13 15:33 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 15:28 [PATCH v4 0/6] Enable TDX module extensions Xu Yilun
2026-10-13 15:28 ` [PATCH v4 1/6] x86/virt/tdx: Move TDH.SYS.CONFIG operations into a wrapper Xu Yilun
2026-10-13 15:28 ` [PATCH v4 2/6] x86/virt/tdx: Configure add-on features on TDX module init Xu Yilun
2026-10-13 15:28 ` [PATCH v4 3/6] x86/virt/tdx: Add extra memory to TDX module for the extensions Xu Yilun
2026-10-13 18:46 ` Edgecombe, Rick P
2026-10-13 15:28 ` [PATCH v4 4/6] x86/virt/tdx: Support DPAMT when adding memory " Xu Yilun
2026-10-13 18:59 ` Edgecombe, Rick P
2026-10-13 15:28 ` [PATCH v4 5/6] x86/virt/tdx: Make TDX module initialize " Xu Yilun
2026-10-13 15:28 ` Xu Yilun [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=20261013-tdx-module-ext-v4-6-de5ffac65470@linux.intel.com \
--to=yilun.xu@linux.intel.com \
--cc=adrian.hunter@intel.com \
--cc=artem.bityutskiy@linux.intel.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=kas@kernel.org \
--cc=kishen.maloor@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=nik.borisov@suse.com \
--cc=peter.fang@intel.com \
--cc=rick.p.edgecombe@intel.com \
--cc=sohil.mehta@intel.com \
--cc=tony.lindgren@linux.intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=yilun.xu@intel.com \
--cc=zhenzhong.duan@intel.com \
/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