From nobody Fri Dec 19 13:57:09 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.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 CA0BC25743D for ; Sat, 6 Dec 2025 01:11:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764983477; cv=none; b=LALH+aFahiNI4xdpRiyCV7TESn7V/tX0UdQcB/4QZsnadO93ZJnqi2vLJ4OEAgBRCLHWJoasnCL6HUO22WdxTgCbVCpzKj8QLoj7ehSQbjzXVlRBgu9XsPbBEuHrJN43SFAoFQFItpLC7JU2g/KtfxxfWzIUtCxBDkahDq4/JmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764983477; c=relaxed/simple; bh=l7luhA58Ogc/VIls8G8zjcbt0uhbWWok9pxvmMLiVs0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YGwBN4KNyWLojaCneDmKceQ3yH4Ab199TTxpSwJg50JTsE4uSQun10ArtfEeEQkLAB3kIEgRDQwSUkakcSScH4uqRmoX6vEhUhXE8O4IMiQIhj8qB8T8+DWjozJ8tthK5A4OHI6NApJSlpaXCtpHWlptO5afR/6sQ1u2jyxbhf0= 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=Xw8n6Z49; arc=none smtp.client-ip=209.85.214.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="Xw8n6Z49" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-29809acd049so61063545ad.3 for ; Fri, 05 Dec 2025 17:11:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1764983474; x=1765588274; 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=9IgG/EwS0rhU6/zESmY7/VVF5fzyu73j5FogJ2Eynxk=; b=Xw8n6Z49pq4+TZuEBFTIDxxeVIp0tYF/lmn7gcgr9I2zvYMfyoXj7hfO9LChYSfan5 DGk74N7chVuIAWL2pdhNHFj/Ky9ogvYZX03HRP96HPsq/xkP3xwiLto2mKHgH4JCFamn cjQufMEptFk28XSxrnispW85f613PSBtqQanDGvql8UCX72VTAVBD7/yg4ppuOsm3Oqp BdwNexO+2O3h7BQVRepvVI7ThRWxl4oKRbYGSMjwF5XcGFmxKPqFiJck3+zX4YFl0qBh wFTdaOoXwz4pVBFrlwPSNhdVUywe0zhnYkP3S7cEqEPHCluWYGhL0pO2QFXOV3ftU3AN 1PYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764983474; x=1765588274; 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=9IgG/EwS0rhU6/zESmY7/VVF5fzyu73j5FogJ2Eynxk=; b=hPEjBeb3rKvRBEE4d+foL88j11KtCnor7b2jRTrgWkV2gmv1/iRgXXo8wyA4bchi4S ONuxmYjDk7V4XIuneAl/FydssPic4zMPy9XoXWFDKt02ZUbPieyyHxHjtV7maX7yON3R Xsn+0R3KXUXH89xBEK3upYfuEgxjc4z8GK99SDBUCmxN8b3WrJKx7/eLYn+XepiRJpl8 wUBi7rCvrBjiOGPuGHoYklp9gpY4KDgiGGBv3PbGLH1AfE6HRtfVXv9QNuTZgB2uhYWQ WOvVED/GFU/Nz5MRUhz6dRFlXs4EoTRqu2VfiFJAC4yX7J5CAGttBapfA6aMcv93WXSw DSIA== X-Gm-Message-State: AOJu0Yyh5OdnFx2kL+3/mkfistYatK2sum7Qzd4s+sPF8xZca+PfW09P aepK1GNOhfwV3O9sN3fN41MKGBWBAzKnZY/KyYobTtVXe5CXBSGttL0TXbQMFgi13Z1dgahpbFN HEG04Vg== X-Google-Smtp-Source: AGHT+IGRS9sQuIP9/GMS0SenwgYnysTWUy3gYbpCBzzZG+YUTgplWaBrw+naN0TdcM0x09NFhWX66ud1UBI= X-Received: from plse4.prod.google.com ([2002:a17:902:b784:b0:298:3a03:dc2e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:240e:b0:298:5599:3ab0 with SMTP id d9443c01a7336-29df59a867bmr7455415ad.16.1764983474152; Fri, 05 Dec 2025 17:11:14 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 5 Dec 2025 17:10:51 -0800 In-Reply-To: <20251206011054.494190-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: <20251206011054.494190-1-seanjc@google.com> X-Mailer: git-send-email 2.52.0.223.gf5cc29aaa4-goog Message-ID: <20251206011054.494190-5-seanjc@google.com> Subject: [PATCH v2 4/7] x86/virt/tdx: Tag a pile of functions as __init, and globals as __ro_after_init 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, Chao Gao , Dan Williams Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that TDX-Module initialization is done during subsys init, tag all related functions as __init, and relevant data as __ro_after_init. Signed-off-by: Sean Christopherson Reviewed-by: Chao Gao Reviewed-by: Dan Williams --- arch/x86/virt/vmx/tdx/tdx.c | 115 ++++++++++---------- arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 10 +- 2 files changed, 64 insertions(+), 61 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 8282c9b1b48b..d49645797fe4 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -55,8 +55,8 @@ static struct tdmr_info_list tdx_tdmr_list; /* All TDX-usable memory regions. Protected by mem_hotplug_lock. */ static LIST_HEAD(tdx_memlist); =20 -static struct tdx_sys_info tdx_sysinfo; -static bool tdx_module_initialized; +static struct tdx_sys_info tdx_sysinfo __ro_after_init; +static bool tdx_module_initialized __ro_after_init; =20 typedef void (*sc_err_func_t)(u64 fn, u64 err, struct tdx_module_args *arg= s); =20 @@ -226,8 +226,9 @@ static struct syscore_ops tdx_syscore_ops =3D { * all memory regions are added in address ascending order and don't * overlap. */ -static int add_tdx_memblock(struct list_head *tmb_list, unsigned long star= t_pfn, - unsigned long end_pfn, int nid) +static __init int add_tdx_memblock(struct list_head *tmb_list, + unsigned long start_pfn, + unsigned long end_pfn, int nid) { struct tdx_memblock *tmb; =20 @@ -245,7 +246,7 @@ static int add_tdx_memblock(struct list_head *tmb_list,= unsigned long start_pfn, return 0; } =20 -static void free_tdx_memlist(struct list_head *tmb_list) +static __init void free_tdx_memlist(struct list_head *tmb_list) { /* @tmb_list is protected by mem_hotplug_lock */ while (!list_empty(tmb_list)) { @@ -263,7 +264,7 @@ static void free_tdx_memlist(struct list_head *tmb_list) * ranges off in a secondary structure because memblock is modified * in memory hotplug while TDX memory regions are fixed. */ -static int build_tdx_memlist(struct list_head *tmb_list) +static __init int build_tdx_memlist(struct list_head *tmb_list) { unsigned long start_pfn, end_pfn; int i, nid, ret; @@ -295,7 +296,7 @@ static int build_tdx_memlist(struct list_head *tmb_list) return ret; } =20 -static int read_sys_metadata_field(u64 field_id, u64 *data) +static __init int read_sys_metadata_field(u64 field_id, u64 *data) { struct tdx_module_args args =3D {}; int ret; @@ -317,7 +318,7 @@ static int read_sys_metadata_field(u64 field_id, u64 *d= ata) =20 #include "tdx_global_metadata.c" =20 -static int check_features(struct tdx_sys_info *sysinfo) +static __init int check_features(struct tdx_sys_info *sysinfo) { u64 tdx_features0 =3D sysinfo->features.tdx_features0; =20 @@ -330,7 +331,7 @@ static int check_features(struct tdx_sys_info *sysinfo) } =20 /* Calculate the actual TDMR size */ -static int tdmr_size_single(u16 max_reserved_per_tdmr) +static __init int tdmr_size_single(u16 max_reserved_per_tdmr) { int tdmr_sz; =20 @@ -344,8 +345,8 @@ static int tdmr_size_single(u16 max_reserved_per_tdmr) return ALIGN(tdmr_sz, TDMR_INFO_ALIGNMENT); } =20 -static int alloc_tdmr_list(struct tdmr_info_list *tdmr_list, - struct tdx_sys_info_tdmr *sysinfo_tdmr) +static __init int alloc_tdmr_list(struct tdmr_info_list *tdmr_list, + struct tdx_sys_info_tdmr *sysinfo_tdmr) { size_t tdmr_sz, tdmr_array_sz; void *tdmr_array; @@ -376,7 +377,7 @@ static int alloc_tdmr_list(struct tdmr_info_list *tdmr_= list, return 0; } =20 -static void free_tdmr_list(struct tdmr_info_list *tdmr_list) +static __init void free_tdmr_list(struct tdmr_info_list *tdmr_list) { free_pages_exact(tdmr_list->tdmrs, tdmr_list->max_tdmrs * tdmr_list->tdmr_sz); @@ -405,8 +406,8 @@ static inline u64 tdmr_end(struct tdmr_info *tdmr) * preallocated @tdmr_list, following all the special alignment * and size rules for TDMR. */ -static int fill_out_tdmrs(struct list_head *tmb_list, - struct tdmr_info_list *tdmr_list) +static __init int fill_out_tdmrs(struct list_head *tmb_list, + struct tdmr_info_list *tdmr_list) { struct tdx_memblock *tmb; int tdmr_idx =3D 0; @@ -482,8 +483,8 @@ static int fill_out_tdmrs(struct list_head *tmb_list, * Calculate PAMT size given a TDMR and a page size. The returned * PAMT size is always aligned up to 4K page boundary. */ -static unsigned long tdmr_get_pamt_sz(struct tdmr_info *tdmr, int pgsz, - u16 pamt_entry_size) +static __init unsigned long tdmr_get_pamt_sz(struct tdmr_info *tdmr, int p= gsz, + u16 pamt_entry_size) { unsigned long pamt_sz, nr_pamt_entries; =20 @@ -514,7 +515,7 @@ static unsigned long tdmr_get_pamt_sz(struct tdmr_info = *tdmr, int pgsz, * PAMT. This node will have some memory covered by the TDMR. The * relative amount of memory covered is not considered. */ -static int tdmr_get_nid(struct tdmr_info *tdmr, struct list_head *tmb_list) +static __init int tdmr_get_nid(struct tdmr_info *tdmr, struct list_head *t= mb_list) { struct tdx_memblock *tmb; =20 @@ -543,9 +544,9 @@ static int tdmr_get_nid(struct tdmr_info *tdmr, struct = list_head *tmb_list) * Allocate PAMTs from the local NUMA node of some memory in @tmb_list * within @tdmr, and set up PAMTs for @tdmr. */ -static int tdmr_set_up_pamt(struct tdmr_info *tdmr, - struct list_head *tmb_list, - u16 pamt_entry_size[]) +static __init int tdmr_set_up_pamt(struct tdmr_info *tdmr, + struct list_head *tmb_list, + u16 pamt_entry_size[]) { unsigned long pamt_base[TDX_PS_NR]; unsigned long pamt_size[TDX_PS_NR]; @@ -615,7 +616,7 @@ static void tdmr_get_pamt(struct tdmr_info *tdmr, unsig= ned long *pamt_base, *pamt_size =3D pamt_sz; } =20 -static void tdmr_do_pamt_func(struct tdmr_info *tdmr, +static __init void tdmr_do_pamt_func(struct tdmr_info *tdmr, void (*pamt_func)(unsigned long base, unsigned long size)) { unsigned long pamt_base, pamt_size; @@ -632,17 +633,17 @@ static void tdmr_do_pamt_func(struct tdmr_info *tdmr, pamt_func(pamt_base, pamt_size); } =20 -static void free_pamt(unsigned long pamt_base, unsigned long pamt_size) +static __init void free_pamt(unsigned long pamt_base, unsigned long pamt_= size) { free_contig_range(pamt_base >> PAGE_SHIFT, pamt_size >> PAGE_SHIFT); } =20 -static void tdmr_free_pamt(struct tdmr_info *tdmr) +static __init void tdmr_free_pamt(struct tdmr_info *tdmr) { tdmr_do_pamt_func(tdmr, free_pamt); } =20 -static void tdmrs_free_pamt_all(struct tdmr_info_list *tdmr_list) +static __init void tdmrs_free_pamt_all(struct tdmr_info_list *tdmr_list) { int i; =20 @@ -651,9 +652,9 @@ static void tdmrs_free_pamt_all(struct tdmr_info_list *= tdmr_list) } =20 /* Allocate and set up PAMTs for all TDMRs */ -static int tdmrs_set_up_pamt_all(struct tdmr_info_list *tdmr_list, - struct list_head *tmb_list, - u16 pamt_entry_size[]) +static __init int tdmrs_set_up_pamt_all(struct tdmr_info_list *tdmr_list, + struct list_head *tmb_list, + u16 pamt_entry_size[]) { int i, ret =3D 0; =20 @@ -702,12 +703,13 @@ void tdx_quirk_reset_page(struct page *page) } EXPORT_SYMBOL_GPL(tdx_quirk_reset_page); =20 -static void tdmr_quirk_reset_pamt(struct tdmr_info *tdmr) +static __init void tdmr_quirk_reset_pamt(struct tdmr_info *tdmr) + { tdmr_do_pamt_func(tdmr, tdx_quirk_reset_paddr); } =20 -static void tdmrs_quirk_reset_pamt_all(struct tdmr_info_list *tdmr_list) +static __init void tdmrs_quirk_reset_pamt_all(struct tdmr_info_list *tdmr_= list) { int i; =20 @@ -715,7 +717,7 @@ static void tdmrs_quirk_reset_pamt_all(struct tdmr_info= _list *tdmr_list) tdmr_quirk_reset_pamt(tdmr_entry(tdmr_list, i)); } =20 -static unsigned long tdmrs_count_pamt_kb(struct tdmr_info_list *tdmr_list) +static __init unsigned long tdmrs_count_pamt_kb(struct tdmr_info_list *tdm= r_list) { unsigned long pamt_size =3D 0; int i; @@ -730,8 +732,8 @@ static unsigned long tdmrs_count_pamt_kb(struct tdmr_in= fo_list *tdmr_list) return pamt_size / 1024; } =20 -static int tdmr_add_rsvd_area(struct tdmr_info *tdmr, int *p_idx, u64 addr, - u64 size, u16 max_reserved_per_tdmr) +static __init int tdmr_add_rsvd_area(struct tdmr_info *tdmr, int *p_idx, + u64 addr, u64 size, u16 max_reserved_per_tdmr) { struct tdmr_reserved_area *rsvd_areas =3D tdmr->reserved_areas; int idx =3D *p_idx; @@ -764,10 +766,10 @@ static int tdmr_add_rsvd_area(struct tdmr_info *tdmr,= int *p_idx, u64 addr, * those holes fall within @tdmr, set up a TDMR reserved area to cover * the hole. */ -static int tdmr_populate_rsvd_holes(struct list_head *tmb_list, - struct tdmr_info *tdmr, - int *rsvd_idx, - u16 max_reserved_per_tdmr) +static __init int tdmr_populate_rsvd_holes(struct list_head *tmb_list, + struct tdmr_info *tdmr, + int *rsvd_idx, + u16 max_reserved_per_tdmr) { struct tdx_memblock *tmb; u64 prev_end; @@ -828,10 +830,10 @@ static int tdmr_populate_rsvd_holes(struct list_head = *tmb_list, * overlaps with @tdmr, set up a TDMR reserved area to cover the * overlapping part. */ -static int tdmr_populate_rsvd_pamts(struct tdmr_info_list *tdmr_list, - struct tdmr_info *tdmr, - int *rsvd_idx, - u16 max_reserved_per_tdmr) +static __init int tdmr_populate_rsvd_pamts(struct tdmr_info_list *tdmr_lis= t, + struct tdmr_info *tdmr, + int *rsvd_idx, + u16 max_reserved_per_tdmr) { int i, ret; =20 @@ -866,7 +868,7 @@ static int tdmr_populate_rsvd_pamts(struct tdmr_info_li= st *tdmr_list, } =20 /* Compare function called by sort() for TDMR reserved areas */ -static int rsvd_area_cmp_func(const void *a, const void *b) +static __init int rsvd_area_cmp_func(const void *a, const void *b) { struct tdmr_reserved_area *r1 =3D (struct tdmr_reserved_area *)a; struct tdmr_reserved_area *r2 =3D (struct tdmr_reserved_area *)b; @@ -885,10 +887,10 @@ static int rsvd_area_cmp_func(const void *a, const vo= id *b) * Populate reserved areas for the given @tdmr, including memory holes * (via @tmb_list) and PAMTs (via @tdmr_list). */ -static int tdmr_populate_rsvd_areas(struct tdmr_info *tdmr, - struct list_head *tmb_list, - struct tdmr_info_list *tdmr_list, - u16 max_reserved_per_tdmr) +static __init int tdmr_populate_rsvd_areas(struct tdmr_info *tdmr, + struct list_head *tmb_list, + struct tdmr_info_list *tdmr_list, + u16 max_reserved_per_tdmr) { int ret, rsvd_idx =3D 0; =20 @@ -913,9 +915,9 @@ static int tdmr_populate_rsvd_areas(struct tdmr_info *t= dmr, * Populate reserved areas for all TDMRs in @tdmr_list, including memory * holes (via @tmb_list) and PAMTs. */ -static int tdmrs_populate_rsvd_areas_all(struct tdmr_info_list *tdmr_list, - struct list_head *tmb_list, - u16 max_reserved_per_tdmr) +static __init int tdmrs_populate_rsvd_areas_all(struct tdmr_info_list *tdm= r_list, + struct list_head *tmb_list, + u16 max_reserved_per_tdmr) { int i; =20 @@ -936,9 +938,9 @@ static int tdmrs_populate_rsvd_areas_all(struct tdmr_in= fo_list *tdmr_list, * to cover all TDX memory regions in @tmb_list based on the TDX module * TDMR global information in @sysinfo_tdmr. */ -static int construct_tdmrs(struct list_head *tmb_list, - struct tdmr_info_list *tdmr_list, - struct tdx_sys_info_tdmr *sysinfo_tdmr) +static __init int construct_tdmrs(struct list_head *tmb_list, + struct tdmr_info_list *tdmr_list, + struct tdx_sys_info_tdmr *sysinfo_tdmr) { u16 pamt_entry_size[TDX_PS_NR] =3D { sysinfo_tdmr->pamt_4k_entry_size, @@ -970,7 +972,8 @@ static int construct_tdmrs(struct list_head *tmb_list, return ret; } =20 -static int config_tdx_module(struct tdmr_info_list *tdmr_list, u64 global_= keyid) +static __init int config_tdx_module(struct tdmr_info_list *tdmr_list, + u64 global_keyid) { struct tdx_module_args args =3D {}; u64 *tdmr_pa_array; @@ -1063,7 +1066,7 @@ static int config_global_keyid(void) return ret; } =20 -static int init_tdmr(struct tdmr_info *tdmr) +static __init int init_tdmr(struct tdmr_info *tdmr) { u64 next; =20 @@ -1094,7 +1097,7 @@ static int init_tdmr(struct tdmr_info *tdmr) return 0; } =20 -static int init_tdmrs(struct tdmr_info_list *tdmr_list) +static __init int init_tdmrs(struct tdmr_info_list *tdmr_list) { int i; =20 @@ -1113,7 +1116,7 @@ static int init_tdmrs(struct tdmr_info_list *tdmr_lis= t) return 0; } =20 -static int init_tdx_module(void) +static __init int init_tdx_module(void) { int ret; =20 @@ -1194,7 +1197,7 @@ static int init_tdx_module(void) goto out_put_tdxmem; } =20 -static int tdx_enable(void) +static __init int tdx_enable(void) { enum cpuhp_state state; int ret; diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vm= x/tdx/tdx_global_metadata.c index 13ad2663488b..360963bc9328 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,7 +7,7 @@ * Include this file to other C file instead. */ =20 -static int get_tdx_sys_info_features(struct tdx_sys_info_features *sysinfo= _features) +static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *= sysinfo_features) { int ret =3D 0; u64 val; @@ -18,7 +18,7 @@ static int get_tdx_sys_info_features(struct tdx_sys_info_= features *sysinfo_featu return ret; } =20 -static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr) +static __init int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_= tdmr) { int ret =3D 0; u64 val; @@ -37,7 +37,7 @@ static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr= *sysinfo_tdmr) return ret; } =20 -static int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sysinfo_t= d_ctrl) +static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sy= sinfo_td_ctrl) { int ret =3D 0; u64 val; @@ -52,7 +52,7 @@ static int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_t= d_ctrl *sysinfo_td_ctrl return ret; } =20 -static int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sysinfo_t= d_conf) +static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sy= sinfo_td_conf) { int ret =3D 0; u64 val; @@ -85,7 +85,7 @@ static int get_tdx_sys_info_td_conf(struct tdx_sys_info_t= d_conf *sysinfo_td_conf return ret; } =20 -static int get_tdx_sys_info(struct tdx_sys_info *sysinfo) +static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { int ret =3D 0; =20 --=20 2.52.0.223.gf5cc29aaa4-goog