Commit 77aa6075 authored by David Matlack's avatar David Matlack Committed by Paolo Bonzini

KVM: x86/mmu: Refactor TDP MMU iterators to take kvm_mmu_page root

Instead of passing a pointer to the root page table and the root level
separately, pass in a pointer to the root kvm_mmu_page struct.  This
reduces the number of arguments by 1, cutting down on line lengths.

No functional change intended.
Reviewed-by: default avatarBen Gardon <bgardon@google.com>
Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
Message-Id: <20220119230739.2234394-12-dmatlack@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 315d86da
...@@ -40,17 +40,19 @@ void tdp_iter_restart(struct tdp_iter *iter) ...@@ -40,17 +40,19 @@ void tdp_iter_restart(struct tdp_iter *iter)
* Sets a TDP iterator to walk a pre-order traversal of the paging structure * Sets a TDP iterator to walk a pre-order traversal of the paging structure
* rooted at root_pt, starting with the walk to translate next_last_level_gfn. * rooted at root_pt, starting with the walk to translate next_last_level_gfn.
*/ */
void tdp_iter_start(struct tdp_iter *iter, u64 *root_pt, int root_level, void tdp_iter_start(struct tdp_iter *iter, struct kvm_mmu_page *root,
int min_level, gfn_t next_last_level_gfn) int min_level, gfn_t next_last_level_gfn)
{ {
int root_level = root->role.level;
WARN_ON(root_level < 1); WARN_ON(root_level < 1);
WARN_ON(root_level > PT64_ROOT_MAX_LEVEL); WARN_ON(root_level > PT64_ROOT_MAX_LEVEL);
iter->next_last_level_gfn = next_last_level_gfn; iter->next_last_level_gfn = next_last_level_gfn;
iter->root_level = root_level; iter->root_level = root_level;
iter->min_level = min_level; iter->min_level = min_level;
iter->pt_path[iter->root_level - 1] = (tdp_ptep_t)root_pt; iter->pt_path[iter->root_level - 1] = (tdp_ptep_t)root->spt;
iter->as_id = kvm_mmu_page_as_id(sptep_to_sp(root_pt)); iter->as_id = kvm_mmu_page_as_id(root);
tdp_iter_restart(iter); tdp_iter_restart(iter);
} }
......
...@@ -57,17 +57,17 @@ struct tdp_iter { ...@@ -57,17 +57,17 @@ struct tdp_iter {
* Iterates over every SPTE mapping the GFN range [start, end) in a * Iterates over every SPTE mapping the GFN range [start, end) in a
* preorder traversal. * preorder traversal.
*/ */
#define for_each_tdp_pte_min_level(iter, root, root_level, min_level, start, end) \ #define for_each_tdp_pte_min_level(iter, root, min_level, start, end) \
for (tdp_iter_start(&iter, root, root_level, min_level, start); \ for (tdp_iter_start(&iter, root, min_level, start); \
iter.valid && iter.gfn < end; \ iter.valid && iter.gfn < end; \
tdp_iter_next(&iter)) tdp_iter_next(&iter))
#define for_each_tdp_pte(iter, root, root_level, start, end) \ #define for_each_tdp_pte(iter, root, start, end) \
for_each_tdp_pte_min_level(iter, root, root_level, PG_LEVEL_4K, start, end) for_each_tdp_pte_min_level(iter, root, PG_LEVEL_4K, start, end)
tdp_ptep_t spte_to_child_pt(u64 pte, int level); tdp_ptep_t spte_to_child_pt(u64 pte, int level);
void tdp_iter_start(struct tdp_iter *iter, u64 *root_pt, int root_level, void tdp_iter_start(struct tdp_iter *iter, struct kvm_mmu_page *root,
int min_level, gfn_t next_last_level_gfn); int min_level, gfn_t next_last_level_gfn);
void tdp_iter_next(struct tdp_iter *iter); void tdp_iter_next(struct tdp_iter *iter);
void tdp_iter_restart(struct tdp_iter *iter); void tdp_iter_restart(struct tdp_iter *iter);
......
...@@ -644,7 +644,7 @@ static inline void tdp_mmu_set_spte_no_dirty_log(struct kvm *kvm, ...@@ -644,7 +644,7 @@ static inline void tdp_mmu_set_spte_no_dirty_log(struct kvm *kvm,
} }
#define tdp_root_for_each_pte(_iter, _root, _start, _end) \ #define tdp_root_for_each_pte(_iter, _root, _start, _end) \
for_each_tdp_pte(_iter, _root->spt, _root->role.level, _start, _end) for_each_tdp_pte(_iter, _root, _start, _end)
#define tdp_root_for_each_leaf_pte(_iter, _root, _start, _end) \ #define tdp_root_for_each_leaf_pte(_iter, _root, _start, _end) \
tdp_root_for_each_pte(_iter, _root, _start, _end) \ tdp_root_for_each_pte(_iter, _root, _start, _end) \
...@@ -654,8 +654,7 @@ static inline void tdp_mmu_set_spte_no_dirty_log(struct kvm *kvm, ...@@ -654,8 +654,7 @@ static inline void tdp_mmu_set_spte_no_dirty_log(struct kvm *kvm,
else else
#define tdp_mmu_for_each_pte(_iter, _mmu, _start, _end) \ #define tdp_mmu_for_each_pte(_iter, _mmu, _start, _end) \
for_each_tdp_pte(_iter, __va(_mmu->root_hpa), \ for_each_tdp_pte(_iter, to_shadow_page(_mmu->root_hpa), _start, _end)
_mmu->shadow_root_level, _start, _end)
/* /*
* Yield if the MMU lock is contended or this thread needs to return control * Yield if the MMU lock is contended or this thread needs to return control
...@@ -744,8 +743,7 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root, ...@@ -744,8 +743,7 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
rcu_read_lock(); rcu_read_lock();
for_each_tdp_pte_min_level(iter, root->spt, root->role.level, for_each_tdp_pte_min_level(iter, root, min_level, start, end) {
min_level, start, end) {
retry: retry:
if (can_yield && if (can_yield &&
tdp_mmu_iter_cond_resched(kvm, &iter, flush, shared)) { tdp_mmu_iter_cond_resched(kvm, &iter, flush, shared)) {
...@@ -1212,8 +1210,7 @@ static bool wrprot_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root, ...@@ -1212,8 +1210,7 @@ static bool wrprot_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
BUG_ON(min_level > KVM_MAX_HUGEPAGE_LEVEL); BUG_ON(min_level > KVM_MAX_HUGEPAGE_LEVEL);
for_each_tdp_pte_min_level(iter, root->spt, root->role.level, for_each_tdp_pte_min_level(iter, root, min_level, start, end) {
min_level, start, end) {
retry: retry:
if (tdp_mmu_iter_cond_resched(kvm, &iter, false, true)) if (tdp_mmu_iter_cond_resched(kvm, &iter, false, true))
continue; continue;
...@@ -1452,8 +1449,7 @@ static bool write_protect_gfn(struct kvm *kvm, struct kvm_mmu_page *root, ...@@ -1452,8 +1449,7 @@ static bool write_protect_gfn(struct kvm *kvm, struct kvm_mmu_page *root,
rcu_read_lock(); rcu_read_lock();
for_each_tdp_pte_min_level(iter, root->spt, root->role.level, for_each_tdp_pte_min_level(iter, root, min_level, gfn, gfn + 1) {
min_level, gfn, gfn + 1) {
if (!is_shadow_present_pte(iter.old_spte) || if (!is_shadow_present_pte(iter.old_spte) ||
!is_last_spte(iter.old_spte, iter.level)) !is_last_spte(iter.old_spte, iter.level))
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment