On Wed, Apr 14, 2010 at 07:32:12PM +0300, Avi Kivity wrote: > On 04/14/2010 07:20 PM, Avi Kivity wrote: > >There is no real distinction between glevels=3 and glevels=4; both have > >exactly the same format and the code is treated exactly the same way. Drop > >role.glevels and replace is with role.cr4_pae (which is meaningful). This > >simplifies the code a bit. > > > >As a side effect, it allows sharing shadow page tables between pae and > >longmode guest page tables at the same guest page. > > > > > static int kvm_sync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) > > { > >- if (sp->role.glevels != vcpu->arch.mmu.root_level) { > >+ if (sp->role.cr4_pae != !!is_pae(vcpu)) { > > kvm_mmu_zap_page(vcpu->kvm, sp); > > return 1; > > } > > This bit confuses me a little. Why is it needed? It will never hit > from mmu_sync_children(), and as for kvm_mmu_get_page(), it will > simply zap unrelated pages? kvm_mmu_get_page is write protecting a gfn. If there's shadow for a different role, and its unsync, it needs to be synchronized. Perhaps it could call the appropriate _sync_page version instead of zapping, similar to mmu_pte_write_new_pte. > Is it related to the restriction that we can only unsync if we have > just one shadow page for a gfn? That's somewhat artificial (and > hurts nonpae guests, and guests with linear page tables). If gfn is shadowed at PMD or higher level, you can't unsync the PTE shadow. -- 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