Skip to content

Commit 6bfb77f

Browse files
kaihuanghansendc
authored andcommitted
x86/virt/tdx: Use dedicated struct members for PAMT entry sizes
Currently, the 'struct tdmr_sys_info_tdmr' which includes TDMR related fields defines the PAMT entry sizes for TDX supported page sizes (4KB, 2MB and 1GB) as an array: struct tdx_sys_info_tdmr { ... u16 pamt_entry_sizes[TDX_PS_NR]; }; PAMT entry sizes are needed when allocating PAMTs for each TDMR. Using the array to contain PAMT entry sizes reduces the number of arguments that need to be passed when calling tdmr_set_up_pamt(). It also makes the code pattern like below clearer: for (pgsz = TDX_PS_4K; pgsz < TDX_PS_NR; pgsz++) { pamt_size[pgsz] = tdmr_get_pamt_sz(tdmr, pgsz, pamt_entry_size[pgsz]); tdmr_pamt_size += pamt_size[pgsz]; } However, the auto-generated metadata reading code generates a structure member for each field. The 'global_metadata.json' has a dedicated field for each PAMT entry size, and the new 'struct tdx_sys_info_tdmr' looks like: struct tdx_sys_info_tdmr { ... u16 pamt_4k_entry_size; u16 pamt_2m_entry_size; u16 pamt_1g_entry_size; }; Prepare to use the autogenerated code by making the existing 'struct tdx_sys_info_tdmr' look like the generated one. When passing to tdmrs_set_up_pamt_all(), build a local array of PAMT entry sizes from the structure so the code to allocate PAMTs can stay the same. Signed-off-by: Kai Huang <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Reviewed-by: Nikolay Borisov <[email protected]> Reviewed-by: Dan Williams <[email protected]> Link: https://lore.kernel.org/all/ccf46f3dacb01be1fb8309592616d443ac17caba.1734188033.git.kai.huang%40intel.com
1 parent 04a7bc7 commit 6bfb77f

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

arch/x86/virt/vmx/tdx/tdx.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ struct field_mapping {
304304
static const struct field_mapping fields[] = {
305305
TD_SYSINFO_MAP(MAX_TDMRS, max_tdmrs),
306306
TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr),
307-
TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]),
308-
TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]),
309-
TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]),
307+
TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_4k_entry_size),
308+
TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_2m_entry_size),
309+
TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_1g_entry_size),
310310
};
311311

312312
static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
@@ -932,14 +932,18 @@ static int construct_tdmrs(struct list_head *tmb_list,
932932
struct tdmr_info_list *tdmr_list,
933933
struct tdx_sys_info_tdmr *sysinfo_tdmr)
934934
{
935+
u16 pamt_entry_size[TDX_PS_NR] = {
936+
sysinfo_tdmr->pamt_4k_entry_size,
937+
sysinfo_tdmr->pamt_2m_entry_size,
938+
sysinfo_tdmr->pamt_1g_entry_size,
939+
};
935940
int ret;
936941

937942
ret = fill_out_tdmrs(tmb_list, tdmr_list);
938943
if (ret)
939944
return ret;
940945

941-
ret = tdmrs_set_up_pamt_all(tdmr_list, tmb_list,
942-
sysinfo_tdmr->pamt_entry_size);
946+
ret = tdmrs_set_up_pamt_all(tdmr_list, tmb_list, pamt_entry_size);
943947
if (ret)
944948
return ret;
945949

arch/x86/virt/vmx/tdx/tdx.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ struct tdmr_info {
8484
struct tdx_sys_info_tdmr {
8585
u16 max_tdmrs;
8686
u16 max_reserved_per_tdmr;
87-
u16 pamt_entry_size[TDX_PS_NR];
87+
u16 pamt_4k_entry_size;
88+
u16 pamt_2m_entry_size;
89+
u16 pamt_1g_entry_size;
8890
};
8991

9092
/* Kernel used global metadata fields */

0 commit comments

Comments
 (0)