[PATCH v3 09/10] x86/virt/tdx: Use early returns in get_tdx_sys_info()

From: Chao Gao

Date: Wed Sep 30 2026 - 01:42:20 EST


get_tdx_sys_info() was generated by a script. It chains its metadata reads
with:

ret = ret ?: get_tdx_sys_info_foo(...);

The function is maintained by hand now. Use conventional early returns
instead.

Print the module version only after its metadata has been read
successfully. The "ret ?:" chain had no early exit, so the pr_info()
between the reads ran even when the version read itself failed, printing a
partially read or all-zero version. That isn't considered a big problem,
but early returns make it easy to avoid.

AI was used under supervision to review code and workshop logs.

Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
---
v3:
- Print the module version only after reading its metadata succeeds [Rick]
---
arch/x86/virt/vmx/tdx/tdx.c | 32 ++++++++++++++++++++++++--------
1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 1a69beb62ec2..e7d4fc3f350f 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -537,19 +537,32 @@ static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *td_conf)

static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo)
{
- int ret = 0;
+ int ret;

- ret = ret ?: read_sys_metadata_table(version_mappings, &sysinfo->version);
+ ret = read_sys_metadata_table(version_mappings, &sysinfo->version);
+ if (ret)
+ return ret;

pr_info("Module version: " TDX_VERSION_FMT "\n",
sysinfo->version.major_version,
sysinfo->version.minor_version,
sysinfo->version.update_version);

- ret = ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->features);
- ret = ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr);
- ret = ret ?: read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctrl);
- ret = ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf);
+ ret = read_sys_metadata_table(feature_mappings, &sysinfo->features);
+ if (ret)
+ return ret;
+
+ ret = read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr);
+ if (ret)
+ return ret;
+
+ ret = read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctrl);
+ if (ret)
+ return ret;
+
+ ret = get_tdx_sys_info_td_conf(&sysinfo->td_conf);
+ if (ret)
+ return ret;

/*
* The kernel supports using TDX without DPAMT, so
@@ -557,10 +570,13 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo)
* try to support buggy TDX modules that advertise
* DPAMT but don't expose the metadata.
*/
- if (!ret && tdx_supports_dynamic_pamt(sysinfo))
+ if (tdx_supports_dynamic_pamt(sysinfo)) {
ret = read_sys_metadata_table(dpamt_mappings, &sysinfo->tdmr);
+ if (ret)
+ return ret;
+ }

- return ret;
+ return 0;
}

static __init int check_features(struct tdx_sys_info *sysinfo)
--
2.52.0