On Sun, Oct 07, 2012 at 08:05:11PM +0800, Xiao Guangrong wrote: > The only difference between FNAME(update_pte) and FNAME(pte_prefetch) > is that the former is allowed to prefetch gfn from dirty logged slot, > so introduce a common function to prefetch spte > > Signed-off-by: Xiao Guangrong <xiaoguangrong@xxxxxxxxxxxxxxxxxx> > --- > arch/x86/kvm/paging_tmpl.h | 55 +++++++++++++++++++------------------------ > 1 files changed, 24 insertions(+), 31 deletions(-) > > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index 36a80ed..f887e4c 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -305,31 +305,43 @@ static int FNAME(walk_addr_nested)(struct guest_walker *walker, > addr, access); > } > > -static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, > - u64 *spte, const void *pte) > +static bool > +FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, > + u64 *spte, pt_element_t gpte, bool no_dirty_log) > { > - pt_element_t gpte; > unsigned pte_access; > + gfn_t gfn; > pfn_t pfn; > > - gpte = *(const pt_element_t *)pte; > if (prefetch_invalid_gpte(vcpu, sp, spte, gpte)) > - return; > + return false; > > pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte); > + > + gfn = gpte_to_gfn(gpte); > pte_access = sp->role.access & gpte_access(vcpu, gpte); > protect_clean_gpte(&pte_access, gpte); > - pfn = gfn_to_pfn_atomic(vcpu->kvm, gpte_to_gfn(gpte)); > + pfn = pte_prefetch_gfn_to_pfn(vcpu, gfn, > + no_dirty_log && (pte_access & ACC_WRITE_MASK)); Is this a bugfix? -- 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