Re: [PATCH] x86/virt/tdx: Use precalculated TDVPR page physical address

Dave Hansen
2025-10-20T15:43:13Z

On 10/20/25 08:25, Sean Christopherson wrote:
>>> @@ -1583,7 +1578,7 @@ u64 tdh_vp_addcx(struct tdx_vp *vp, struct page *tdcx_page)
>>> {
>>> struct tdx_module_args args = {
>>> .rcx = page_to_phys(tdcx_page),
>>> - .rdx = tdx_tdvpr_pa(vp),
>>> + .rdx = vp->tdvpr_pa,
>>> };
>> I'm kinda dense normally and my coffee hasn't kicked in yet. What
>> clearly does not work there?
> Relying on struct page to provide type safety.
>
>> Yeah, vp->tdvpr_pa is storing a physical address as a raw u64 and not a
>> 'struct page'. That's not ideal. But it's also for a pretty good reason.
> Right, but my point is that regradless of the justification, every exception to
> passing a struct page diminishes the benefits of using struct page in the first
> place.

Yeah, I'm in total agreement with you there.

But I don't think there's any type scheme that won't have exceptions or
other downsides.

u64's are really nice for prototyping because you can just pass those
suckers around anywhere and the compiler will never say a thing. But we
know the downsides of too many plain integer types getting passed around.

Sparse-enforced address spaces are pretty nifty, but they can get messy
around the edges of the subsystem where the type is used. You end up
with lots of ugly force casts there to bend the compiler to your will.

'struct page *' isn't perfect either. As we saw, you can't get from it
to a physical address easily in noinstr code. It doesn't work everywhere
either.

So I dunno. Sounds like there is no shortage of imperfect ways skin this
cat. Yay, engineering!

But, seriously, if you're super confident that a sparse-enforced address
space is the way to go, it's not *that* hard to go look at it. TDX isn't
that big. I can go poke at it for a bit.