x86/virt/tdx: allocate tdx_sys_info in static memory
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 22 Jan 2025 11:00:28 +0000 (06:00 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Mar 2025 18:20:49 +0000 (14:20 -0400)
Adding all the information that KVM needs increases the size of struct
tdx_sys_info, to the point that you can get warnings about the stack
size of init_tdx_module().  Since KVM also needs to read the TDX metadata
after init_tdx_module() returns, make the variable a global.

Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Kai Huang <kai.huang@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/virt/vmx/tdx/tdx.c

index 369b264f4d9bb29b2484b0e2741a87ecc2176173..578ad468634b95183509771f52cc8b9da8db67e5 100644 (file)
@@ -53,6 +53,8 @@ static DEFINE_MUTEX(tdx_module_lock);
 /* All TDX-usable memory regions.  Protected by mem_hotplug_lock. */
 static LIST_HEAD(tdx_memlist);
 
+static struct tdx_sys_info tdx_sysinfo;
+
 typedef void (*sc_err_func_t)(u64 fn, u64 err, struct tdx_module_args *args);
 
 static inline void seamcall_err(u64 fn, u64 err, struct tdx_module_args *args)
@@ -1061,15 +1063,14 @@ static int init_tdmrs(struct tdmr_info_list *tdmr_list)
 
 static int init_tdx_module(void)
 {
-       struct tdx_sys_info sysinfo;
        int ret;
 
-       ret = get_tdx_sys_info(&sysinfo);
+       ret = get_tdx_sys_info(&tdx_sysinfo);
        if (ret)
                return ret;
 
        /* Check whether the kernel can support this module */
-       ret = check_features(&sysinfo);
+       ret = check_features(&tdx_sysinfo);
        if (ret)
                return ret;
 
@@ -1090,12 +1091,12 @@ static int init_tdx_module(void)
                goto out_put_tdxmem;
 
        /* Allocate enough space for constructing TDMRs */
-       ret = alloc_tdmr_list(&tdx_tdmr_list, &sysinfo.tdmr);
+       ret = alloc_tdmr_list(&tdx_tdmr_list, &tdx_sysinfo.tdmr);
        if (ret)
                goto err_free_tdxmem;
 
        /* Cover all TDX-usable memory regions in TDMRs */
-       ret = construct_tdmrs(&tdx_memlist, &tdx_tdmr_list, &sysinfo.tdmr);
+       ret = construct_tdmrs(&tdx_memlist, &tdx_tdmr_list, &tdx_sysinfo.tdmr);
        if (ret)
                goto err_free_tdmrs;