KVM: x86/mmu: Refactor low-level TDP MMU set SPTE helper to take raw values
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@google.com> Reviewed-by: Ben Gardon <bgardon@google.com> Message-Id: <20220226001546.360188-13-seanjc@google.com> Reviewed-by: Mingwei Zhang <mizhang@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
966da62ada
commit
626808d137
@ -603,9 +603,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
|
||||
@ -617,12 +621,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);
|
||||
|
||||
/*
|
||||
@ -632,39 +634,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) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user