On 11/13/24 12:51, Edgecombe, Rick P wrote: > However, some future user of TDH.PHYMEM.PAGE.RECLAIM might want to do something > else where the enums could add code clarity. But this goes down the road of > building things that are not needed today. Here's why the current code is a bit suboptimal: > +/* TDH.PHYMEM.PAGE.RECLAIM is allowed only when destroying the TD. */ > +static int __tdx_reclaim_page(hpa_t pa) > +{ ... > + for (i = TDX_SEAMCALL_RETRIES; i > 0; i--) { > + err = tdh_phymem_page_reclaim(pa, &rcx, &rdx, &r8); ... > +out: > + if (WARN_ON_ONCE(err)) { > + pr_tdx_error_3(TDH_PHYMEM_PAGE_RECLAIM, err, rcx, rdx, r8); > + return -EIO; > + } > + return 0; > +} Let's say I see the error get spit out on the console. I can't make any sense out of it from this spot. I need to go over to the TDX docs or tdh_phymem_page_reclaim() to look at the *comment* to figure out what these the registers are named. The code as proposed has zero self-documenting properties. It's actually completely non-self-documenting. It isn't _any_ better for readability than just doing: struct tdx_module_args args = {}; for (i = TDX_SEAMCALL_RETRIES; i > 0; i--) { args.rcx = pa; err = seamcall_ret(TDH_PHYMEM_PAGE_RECLAIM, &args); ... } pr_tdx_error_3(TDH_PHYMEM_PAGE_RECLAIM, err, args.rcx, args.rdx, args.r8); Also, this is also showing a lack of naming discipline where things are named. The first argument is 'pa' in here but 'page' on the other side: > +u64 tdh_phymem_page_reclaim(u64 page, u64 *rcx, u64 *rdx, u64 *r8) > +{ > + struct tdx_module_args args = { > + .rcx = page, I can't tell you how many recompiles it's cost me when I got lazy about physical addr vs. virtual addr vs. struct page vs. pfn. So, yeah, I'd rather not export seamcall_ret(), but I'd rather do that than have a layer of abstraction that's adding little value while it also brings obfuscation.