On Sat, Feb 26, 2022, Sean Christopherson wrote: > Refactor __tdp_mmu_set_spte() to work with raw values instead of a > tdp_iter objects so that a future patch can modify SPTEs without doing a > walk, and without having to synthesize a tdp_iter. > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > Reviewed-by: Ben Gardon <bgardon@xxxxxxxxxx> Reviewed-by: Mingwei Zhang <mizhang@xxxxxxxxxx> > --- > arch/x86/kvm/mmu/tdp_mmu.c | 51 +++++++++++++++++++++++--------------- > 1 file changed, 31 insertions(+), 20 deletions(-) > > diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c > index 1dcdf1a4fcc1..9e8ba6f12ebf 100644 > --- a/arch/x86/kvm/mmu/tdp_mmu.c > +++ b/arch/x86/kvm/mmu/tdp_mmu.c > @@ -617,9 +617,13 @@ static inline int tdp_mmu_zap_spte_atomic(struct kvm *kvm, > > /* > * __tdp_mmu_set_spte - Set a TDP MMU SPTE and handle the associated bookkeeping > - * @kvm: kvm instance > - * @iter: a tdp_iter instance currently on the SPTE that should be set > - * @new_spte: The value the SPTE should be set to > + * @kvm: KVM instance > + * @as_id: Address space ID, i.e. regular vs. SMM > + * @sptep: Pointer to the SPTE > + * @old_spte: The current value of the SPTE > + * @new_spte: The new value that will be set for the SPTE > + * @gfn: The base GFN that was (or will be) mapped by the SPTE > + * @level: The level _containing_ the SPTE (its parent PT's level) > * @record_acc_track: Notify the MM subsystem of changes to the accessed state > * of the page. Should be set unless handling an MMU > * notifier for access tracking. Leaving record_acc_track > @@ -631,12 +635,10 @@ static inline int tdp_mmu_zap_spte_atomic(struct kvm *kvm, > * Leaving record_dirty_log unset in that case prevents page > * writes from being double counted. > */ > -static inline void __tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter, > - u64 new_spte, bool record_acc_track, > - bool record_dirty_log) > +static void __tdp_mmu_set_spte(struct kvm *kvm, int as_id, tdp_ptep_t sptep, > + u64 old_spte, u64 new_spte, gfn_t gfn, int level, > + bool record_acc_track, bool record_dirty_log) > { > - WARN_ON_ONCE(iter->yielded); > - > lockdep_assert_held_write(&kvm->mmu_lock); > > /* > @@ -646,39 +648,48 @@ static inline void __tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter, > * should be used. If operating under the MMU lock in write mode, the > * use of the removed SPTE should not be necessary. > */ > - WARN_ON(is_removed_spte(iter->old_spte) || is_removed_spte(new_spte)); > + WARN_ON(is_removed_spte(old_spte) || is_removed_spte(new_spte)); > > - kvm_tdp_mmu_write_spte(iter->sptep, new_spte); > + kvm_tdp_mmu_write_spte(sptep, new_spte); > + > + __handle_changed_spte(kvm, as_id, gfn, old_spte, new_spte, level, false); > > - __handle_changed_spte(kvm, iter->as_id, iter->gfn, iter->old_spte, > - new_spte, iter->level, false); > if (record_acc_track) > - handle_changed_spte_acc_track(iter->old_spte, new_spte, > - iter->level); > + handle_changed_spte_acc_track(old_spte, new_spte, level); > if (record_dirty_log) > - handle_changed_spte_dirty_log(kvm, iter->as_id, iter->gfn, > - iter->old_spte, new_spte, > - iter->level); > + handle_changed_spte_dirty_log(kvm, as_id, gfn, old_spte, > + new_spte, level); > +} > + > +static inline void _tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter, > + u64 new_spte, bool record_acc_track, > + bool record_dirty_log) > +{ > + WARN_ON_ONCE(iter->yielded); > + > + __tdp_mmu_set_spte(kvm, iter->as_id, iter->sptep, iter->old_spte, > + new_spte, iter->gfn, iter->level, > + record_acc_track, record_dirty_log); > } > > static inline void tdp_mmu_set_spte(struct kvm *kvm, struct tdp_iter *iter, > u64 new_spte) > { > - __tdp_mmu_set_spte(kvm, iter, new_spte, true, true); > + _tdp_mmu_set_spte(kvm, iter, new_spte, true, true); > } > > static inline void tdp_mmu_set_spte_no_acc_track(struct kvm *kvm, > struct tdp_iter *iter, > u64 new_spte) > { > - __tdp_mmu_set_spte(kvm, iter, new_spte, false, true); > + _tdp_mmu_set_spte(kvm, iter, new_spte, false, true); > } > > static inline void tdp_mmu_set_spte_no_dirty_log(struct kvm *kvm, > struct tdp_iter *iter, > u64 new_spte) > { > - __tdp_mmu_set_spte(kvm, iter, new_spte, true, false); > + _tdp_mmu_set_spte(kvm, iter, new_spte, true, false); > } > > #define tdp_root_for_each_pte(_iter, _root, _start, _end) \ > -- > 2.35.1.574.g5d30c73bfb-goog >