Lines Matching refs:iter
12 static void tdp_iter_refresh_sptep(struct tdp_iter *iter)
14 iter->sptep = iter->pt_path[iter->level - 1] +
15 SPTE_INDEX(iter->gfn << PAGE_SHIFT, iter->level);
16 iter->old_spte = kvm_tdp_mmu_read_spte(iter->sptep);
23 void tdp_iter_restart(struct tdp_iter *iter)
25 iter->yielded = false;
26 iter->yielded_gfn = iter->next_last_level_gfn;
27 iter->level = iter->root_level;
29 iter->gfn = gfn_round_for_level(iter->next_last_level_gfn, iter->level);
30 tdp_iter_refresh_sptep(iter);
32 iter->valid = true;
39 void tdp_iter_start(struct tdp_iter *iter, struct kvm_mmu_page *root,
44 iter->valid = false;
48 iter->next_last_level_gfn = next_last_level_gfn;
49 iter->root_level = root->role.level;
50 iter->min_level = min_level;
51 iter->pt_path[iter->root_level - 1] = (tdp_ptep_t)root->spt;
52 iter->as_id = kvm_mmu_page_as_id(root);
54 tdp_iter_restart(iter);
78 static bool try_step_down(struct tdp_iter *iter)
82 if (iter->level == iter->min_level)
89 iter->old_spte = kvm_tdp_mmu_read_spte(iter->sptep);
91 child_pt = spte_to_child_pt(iter->old_spte, iter->level);
95 iter->level--;
96 iter->pt_path[iter->level - 1] = child_pt;
97 iter->gfn = gfn_round_for_level(iter->next_last_level_gfn, iter->level);
98 tdp_iter_refresh_sptep(iter);
110 static bool try_step_side(struct tdp_iter *iter)
116 if (SPTE_INDEX(iter->gfn << PAGE_SHIFT, iter->level) ==
120 iter->gfn += KVM_PAGES_PER_HPAGE(iter->level);
121 iter->next_last_level_gfn = iter->gfn;
122 iter->sptep++;
123 iter->old_spte = kvm_tdp_mmu_read_spte(iter->sptep);
133 static bool try_step_up(struct tdp_iter *iter)
135 if (iter->level == iter->root_level)
138 iter->level++;
139 iter->gfn = gfn_round_for_level(iter->gfn, iter->level);
140 tdp_iter_refresh_sptep(iter);
161 void tdp_iter_next(struct tdp_iter *iter)
163 if (iter->yielded) {
164 tdp_iter_restart(iter);
168 if (try_step_down(iter))
172 if (try_step_side(iter))
174 } while (try_step_up(iter));
175 iter->valid = false;