On Fri, 2022-03-04 at 11:49 -0800, isaku.yamahata@xxxxxxxxx wrote: > From: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > Add a private pointer to kvm_mmu_page for private EPT. > > To resolve KVM page fault on private GPA, it will allocate additional page > for Secure EPT in addition to private EPT. Add memory allocator for it and > topup its memory allocator before resolving KVM page fault similar to > shared EPT page. Allocation of those memory will be done for TDP MMU by > alloc_tdp_mmu_page(). Freeing those memory will be done for TDP MMU on > behalf of kvm_tdp_mmu_zap_all() called by kvm_mmu_zap_all(). Private EPT > page needs to carry one more page used for Secure EPT in addition to the > private EPT page. Add private pointer to struct kvm_mmu_page for that > purpose and Add helper functions to allocate/free a page for Secure EPT. > Also add helper functions to check if a given kvm_mmu_page is private. > > Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > --- > arch/x86/include/asm/kvm_host.h | 1 + > arch/x86/kvm/mmu/mmu.c | 9 ++++ > arch/x86/kvm/mmu/mmu_internal.h | 84 +++++++++++++++++++++++++++++++++ > arch/x86/kvm/mmu/tdp_mmu.c | 3 ++ > 4 files changed, 97 insertions(+) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index fcab2337819c..0c8cc7d73371 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -689,6 +689,7 @@ struct kvm_vcpu_arch { > struct kvm_mmu_memory_cache mmu_shadow_page_cache; > struct kvm_mmu_memory_cache mmu_gfn_array_cache; > struct kvm_mmu_memory_cache mmu_page_header_cache; > + struct kvm_mmu_memory_cache mmu_private_sp_cache; > > /* > * QEMU userspace and the guest each have their own FPU state. > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 6e9847b1124b..8def8b97978f 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -758,6 +758,13 @@ static int mmu_topup_shadow_page_cache(struct kvm_vcpu *vcpu) > struct kvm_mmu_memory_cache *mc = &vcpu->arch.mmu_shadow_page_cache; > int start, end, i, r; > > + if (kvm_gfn_stolen_mask(vcpu->kvm)) { Please get rid of kvm_gfn_stolen_mask(). > + r = kvm_mmu_topup_memory_cache(&vcpu->arch.mmu_private_sp_cache, > + PT64_ROOT_MAX_LEVEL); > + if (r) > + return r; > + } > + > if (shadow_init_value) > start = kvm_mmu_memory_cache_nr_free_objects(mc); >