On Wed, 2024-03-20 at 17:11 -0700, Rick Edgecombe wrote: > @@ -1378,6 +1375,8 @@ int kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, struct > kvm_page_fault *fault) > * needs to be split. > */ > sp = tdp_mmu_alloc_sp(vcpu); > + if (!(raw_gfn & kvm_gfn_shared_mask(kvm))) > + kvm_mmu_alloc_private_spt(vcpu, sp); This will try to allocate the private SP for normal VMs (which have a zero shared mask), it should be: diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index efed70580922..585c80fb62c5 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1350,7 +1350,7 @@ int kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) * needs to be split. */ sp = tdp_mmu_alloc_sp(vcpu); - if (!(raw_gfn & kvm_gfn_shared_mask(kvm))) + if (kvm_is_private_gpa(kvm, raw_gfn << PAGE_SHIFT)) kvm_mmu_alloc_private_spt(vcpu, sp); tdp_mmu_init_child_sp(sp, &iter);