On Sun, Mar 29, 2009 at 02:45:44PM +0300, Avi Kivity wrote: > Joerg Roedel wrote: >> This patch adds the necessary data structures to take care of write >> protections in place within a second huge page sized page. >> >> struct kvm_vcpu_arch { >> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c >> index 9936b45..7d4162d 100644 >> --- a/arch/x86/kvm/mmu.c >> +++ b/arch/x86/kvm/mmu.c >> @@ -390,6 +390,15 @@ static int *slot_largepage_idx(gfn_t gfn, struct kvm_memory_slot *slot) >> return &slot->lpage_info[idx].write_count; >> } >> +static int *slot_hugepage_idx(gfn_t gfn, struct kvm_memory_slot >> *slot) >> +{ >> + unsigned long idx; >> + >> + idx = (gfn / KVM_PAGES_PER_1G_PAGE) - >> + (slot->base_gfn / KVM_PAGES_PER_1G_PAGE); >> + return &slot->hpage_info[idx].write_count; >> +} >> > > A page level argument would remove the need for this duplication, as > well as all the constants. > >> +static int has_wrprotected_largepage(struct kvm *kvm, gfn_t gfn) >> +{ >> + struct kvm_memory_slot *slot; >> + int *hugepage_idx; >> + >> + gfn = unalias_gfn(kvm, gfn); >> + slot = gfn_to_memslot_unaliased(kvm, gfn); >> + if (slot) { >> + hugepage_idx = slot_hugepage_idx(gfn, slot); >> > > slot_largepage_idx() here? > > I don't think we ever write protect large pages, so why is this needed? For 2mb pages we need to check if there is a write-protected 4k page in it before we map a 2mb page for writing. If there is any write-protected 4k page in a 2mb area this 2mb page is considered write-protected. These 'write-protected' 2mb pages are accounted in the account_shadow() function. This information is taken into account when we decide if we can map a guest 1gb page as a 1gb page on the host too. Joerg -- 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