On Wed, Sep 10, 2025 at 07:44:53AM -0700, Dave Hansen wrote: > From: Kai Huang <kai.huang@xxxxxxxxx> > > All of the x86 KVM guest types (VMX, SEV and TDX) do some special context > tracking when entering guests. This means that the actual guest entry > sequence must be noinstr. > > Part of entering a TDX guest is passing a physical address to the TDX > module. Right now, that physical address is stored as a 'struct page' > and converted to a physical address at guest entry. That page=>phys > conversion can be complicated, can vary greatly based on kernel > config, and it is definitely _not_ a noinstr path today. > > There have been a number of tinkering approaches to try and fix this > up, but they all fall down due to some part of the page=>phys > conversion infrastructure not being noinstr friendly. > > Precalculate the page=>phys conversion and store it in the existing > 'tdx_vp' structure. Use the new field at every site that needs a > tdvpr physical address. Remove the now redundant tdx_tdvpr_pa(). > Remove the __flatten remnant from the tinkering. > > Note that only one user of the new field is actually noinstr. All > others can use page_to_phys(). But, they might as well save the effort > since there is a pre-calculated value sitting there for them. > > [ dhansen: rewrite all the text ] > > Signed-off-by: Kai Huang <kai.huang@xxxxxxxxx> > Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx> > Tested-by: Farrah Chen <farrah.chen@xxxxxxxxx> Reviewed-by: Kiryl Shutsemau <kas@xxxxxxxxxx> One nitpick is below. > --- > arch/x86/include/asm/tdx.h | 2 ++ > arch/x86/kvm/vmx/tdx.c | 9 +++++++++ > arch/x86/virt/vmx/tdx/tdx.c | 21 ++++++++------------- > 3 files changed, 19 insertions(+), 13 deletions(-) > > diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h > index 6120461bd5ff3..6b338d7f01b7d 100644 > --- a/arch/x86/include/asm/tdx.h > +++ b/arch/x86/include/asm/tdx.h > @@ -171,6 +171,8 @@ struct tdx_td { > struct tdx_vp { > /* TDVP root page */ > struct page *tdvpr_page; > + /* precalculated page_to_phys(tdvpr_page) for use in noinstr code */ > + phys_addr_t tdvpr_pa; Missing newline above the new field? -- Kiryl Shutsemau / Kirill A. Shutemov