On Sun, Mar 29, 2009 at 03:24:08PM +0300, Avi Kivity wrote: >> static int mmu_pages_next(struct kvm_mmu_pages *pvec, >> struct mmu_page_path *parents, >> int i) >> { >> int n; >> >> for (n = i+1; n < pvec->nr; n++) { >> struct kvm_mmu_page *sp = pvec->page[n].sp; >> >> if (sp->role.level == PT_PAGE_TABLE_LEVEL) { >> parents->idx[0] = pvec->page[n].idx; >> return n; >> } >> >> parents->parent[sp->role.level-2] = sp; >> parents->idx[sp->role.level-1] = pvec->page[n].idx; >> } >> >> return n; >> } > > Do we need to break out of the loop if we switch parents during the loop > (since that will give us a different mmu_page_path)? Or are callers > careful to only pass pvecs which belong to the same shadow page? This function builds mmu_page_path for a number of pagetable (leaf) pages. Whenever the path changes, mmu_page_path will be rebuilt. The pages in the pvec must be organized as follows: level4, level3, level2, level1, level1, level1, ...., level3, level2, level1, level1, ... So you don't have to repeat higher levels for a number of leaf pages. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html