Re: [PATCH v11 10/20] x86/virt/tdx: Add placeholder to construct TDMRs to cover all TDX memory regions

From: Huang, Kai
Date: Sun Jun 11 2023 - 22:22:01 EST


On Fri, 2023-06-09 at 01:52 +0300, kirill.shutemov@xxxxxxxxxxxxxxx wrote:
> On Mon, Jun 05, 2023 at 02:27:23AM +1200, Kai Huang wrote:
> > @@ -50,6 +51,8 @@ static DEFINE_MUTEX(tdx_module_lock);
> > /* All TDX-usable memory regions. Protected by mem_hotplug_lock. */
> > static LIST_HEAD(tdx_memlist);
> >
> > +static struct tdmr_info_list tdx_tdmr_list;
> > +
> > /*
> > * Wrapper of __seamcall() to convert SEAMCALL leaf function error code
> > * to kernel error code. @seamcall_ret and @out contain the SEAMCALL
>
> The name is misleading. It is not list, it is an array.

I followed Dave's suggestion in v7:

https://lore.kernel.org/lkml/d84ad1d2-83f9-dab5-5639-8d71f382e3ff@xxxxxxxxx/

Quote the relevant part here:

"
> +static struct tdmr_info *tdmr_array_entry(struct tdmr_info *tdmr_array,
> + int idx)
> +{
> + return (struct tdmr_info *)((unsigned long)tdmr_array +
> + cal_tdmr_size() * idx);
> +}

FWIW, I think it's probably a bad idea to have 'struct tdmr_info *'
types floating around since:

tmdr_info_array[0]

works, but:

tmdr_info_array[1]

will blow up in your face. It would almost make sense to have

struct tdmr_info_list {
struct tdmr_info *first_tdmr;
}

and then pass around pointers to the 'struct tdmr_info_list'. Maybe
that's overkill, but it is kinda silly to call something an array if []
doesn't work on it.
"

Personally I think it's also fine to use 'list' (e.g., we can also interpret the
name from "English language"'s perspective).

Hi Dave,

Should I change the name to "tdmr_info_array"?


>
>
> ...
>
> > @@ -112,6 +135,15 @@ struct tdx_memblock {
> > unsigned long end_pfn;
> > };
> >
> > +struct tdmr_info_list {
> > + void *tdmrs; /* Flexible array to hold 'tdmr_info's */
> > + int nr_consumed_tdmrs; /* How many 'tdmr_info's are in use */
> > +
> > + /* Metadata for finding target 'tdmr_info' and freeing @tdmrs */
> > + int tdmr_sz; /* Size of one 'tdmr_info' */
> > + int max_tdmrs; /* How many 'tdmr_info's are allocated */
> > +};
> > +
> > struct tdx_module_output;
> > u64 __seamcall(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
> > struct tdx_module_output *out);
>
> Otherwise, looks okay.
>
> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx>
>