On Wed, May 14, 2025 at 02:30:34PM +0800, Chao Gao wrote: > On Fri, May 02, 2025 at 04:08:25PM +0300, Kirill A. Shutemov wrote: > >Preallocate a page to be used in the link_external_spt() and > >set_external_spte() paths. > > > >In the worst-case scenario, handling a page fault might require a > >tdx_nr_pamt_pages() pages for each page table level. > > > >Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > >--- > > arch/x86/include/asm/kvm_host.h | 2 ++ > > arch/x86/kvm/mmu/mmu.c | 10 ++++++++++ > > 2 files changed, 12 insertions(+) > > > >diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > >index 91958c55f918..a5661499a176 100644 > >--- a/arch/x86/include/asm/kvm_host.h > >+++ b/arch/x86/include/asm/kvm_host.h > >@@ -849,6 +849,8 @@ struct kvm_vcpu_arch { > > */ > > struct kvm_mmu_memory_cache mmu_external_spt_cache; > > > >+ struct kvm_mmu_memory_cache pamt_page_cache; > >+ > > /* > > * QEMU userspace and the guest each have their own FPU state. > > * In vcpu_run, we switch between the user and guest FPU contexts. > >diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > >index a284dce227a0..7bfa0dc50440 100644 > >--- a/arch/x86/kvm/mmu/mmu.c > >+++ b/arch/x86/kvm/mmu/mmu.c > >@@ -616,6 +616,15 @@ static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu, bool maybe_indirect) > > if (r) > > return r; > > } > >+ > >+ if (vcpu->kvm->arch.vm_type == KVM_X86_TDX_VM) { > > The check for vcpu->kvm->arch.vm_type == KVM_X86_TDX_VM is identical to > kvm_has_mirrored_tdp() a few lines above. Well, yes. But I think it is conceptually different. There can be different virtualization mode that has mirrored TDP which is not TDX. > > >+ int nr = tdx_nr_pamt_pages(tdx_get_sysinfo()); > > Since you're already accessing tdx_sysinfo, you can check if dynamic PAMT is > enabled and allocate the pamt page cache accordingly. I will hide it in tdx_nr_pamt_pages() which would return 0 if Dynamic PAMT is disabled. -- Kiryl Shutsemau / Kirill A. Shutemov