Reviewed-by: Yan Zhao <yan.y.zhao@xxxxxxxxx> On Fri, Mar 10, 2023 at 04:22:43PM -0800, Sean Christopherson wrote: > Don't use the generic page-track mechanism to handle writes to guest PTEs > in KVM's MMU. KVM's MMU needs access to information that should not be > exposed to external page-track users, e.g. KVM needs (for some definitions > of "need") the vCPU to query the current paging mode, whereas external > users, i.e. KVMGT, have no ties to the current vCPU and so should never > need the vCPU. > > Moving away from the page-track mechanism will allow dropping use of the > page-track mechanism for KVM's own MMU, and will also allow simplifying > and cleaning up the page-track APIs. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > arch/x86/include/asm/kvm_host.h | 1 - > arch/x86/kvm/mmu.h | 2 ++ > arch/x86/kvm/mmu/mmu.c | 13 ++----------- > arch/x86/kvm/mmu/page_track.c | 2 ++ > 4 files changed, 6 insertions(+), 12 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 17281d6825c9..1a4225237564 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -1265,7 +1265,6 @@ struct kvm_arch { > * create an NX huge page (without hanging the guest). > */ > struct list_head possible_nx_huge_pages; > - struct kvm_page_track_notifier_node mmu_sp_tracker; > struct kvm_page_track_notifier_head track_notifier_head; > /* > * Protects marking pages unsync during page faults, as TDP MMU page > diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h > index 168c46fd8dd1..b8bde42f6037 100644 > --- a/arch/x86/kvm/mmu.h > +++ b/arch/x86/kvm/mmu.h > @@ -119,6 +119,8 @@ void kvm_mmu_unload(struct kvm_vcpu *vcpu); > void kvm_mmu_free_obsolete_roots(struct kvm_vcpu *vcpu); > void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu); > void kvm_mmu_sync_prev_roots(struct kvm_vcpu *vcpu); > +void kvm_mmu_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new, > + int bytes); > > static inline int kvm_mmu_reload(struct kvm_vcpu *vcpu) > { > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 409dabec69df..4f2f83d8322e 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -5603,9 +5603,8 @@ static u64 *get_written_sptes(struct kvm_mmu_page *sp, gpa_t gpa, int *nspte) > return spte; > } > > -static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, > - const u8 *new, int bytes, > - struct kvm_page_track_notifier_node *node) > +void kvm_mmu_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new, > + int bytes) > { > gfn_t gfn = gpa >> PAGE_SHIFT; > struct kvm_mmu_page *sp; > @@ -6088,7 +6087,6 @@ static bool kvm_has_zapped_obsolete_pages(struct kvm *kvm) > > int kvm_mmu_init_vm(struct kvm *kvm) > { > - struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker; > int r; > > INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); > @@ -6102,9 +6100,6 @@ int kvm_mmu_init_vm(struct kvm *kvm) > return r; > } > > - node->track_write = kvm_mmu_pte_write; > - kvm_page_track_register_notifier(kvm, node); > - > kvm->arch.split_page_header_cache.kmem_cache = mmu_page_header_cache; > kvm->arch.split_page_header_cache.gfp_zero = __GFP_ZERO; > > @@ -6125,10 +6120,6 @@ static void mmu_free_vm_memory_caches(struct kvm *kvm) > > void kvm_mmu_uninit_vm(struct kvm *kvm) > { > - struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker; > - > - kvm_page_track_unregister_notifier(kvm, node); > - > if (tdp_mmu_enabled) > kvm_mmu_uninit_tdp_mmu(kvm); > > diff --git a/arch/x86/kvm/mmu/page_track.c b/arch/x86/kvm/mmu/page_track.c > index e739dcc3375c..f39f190ad4ae 100644 > --- a/arch/x86/kvm/mmu/page_track.c > +++ b/arch/x86/kvm/mmu/page_track.c > @@ -274,6 +274,8 @@ void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new, > if (n->track_write) > n->track_write(vcpu, gpa, new, bytes, n); > srcu_read_unlock(&head->track_srcu, idx); > + > + kvm_mmu_track_write(vcpu, gpa, new, bytes); > } > > /* > -- > 2.40.0.rc1.284.g88254d51c5-goog >