On Wed, Nov 17, 2010 at 12:13:59PM +0800, Xiao Guangrong wrote: > Abstract the same operation to cleanup them > > Signed-off-by: Xiao Guangrong <xiaoguangrong@xxxxxxxxxxxxxx> > --- > arch/x86/kvm/mmu.c | 3 -- > arch/x86/kvm/paging_tmpl.h | 70 ++++++++++++++++++++++--------------------- > 2 files changed, 36 insertions(+), 37 deletions(-) > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 0668f4b..c513afc 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -3082,9 +3082,6 @@ static void mmu_pte_write_new_pte(struct kvm_vcpu *vcpu, > return; > } > > - if (is_rsvd_bits_set(&vcpu->arch.mmu, *(u64 *)new, PT_PAGE_TABLE_LEVEL)) > - return; > - > ++vcpu->kvm->stat.mmu_pte_updated; > if (!sp->role.cr4_pae) > paging32_update_pte(vcpu, sp, spte, new); > diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h > index 60f00db..01a00b0 100644 > --- a/arch/x86/kvm/paging_tmpl.h > +++ b/arch/x86/kvm/paging_tmpl.h > @@ -299,25 +299,43 @@ static int FNAME(walk_addr_nested)(struct guest_walker *walker, > addr, access); > } > > +static bool FNAME(map_invalid_gpte)(struct kvm_vcpu *vcpu, > + struct kvm_mmu_page *sp, u64 *spte, > + pt_element_t gpte) > +{ > + u64 nonpresent = shadow_trap_nonpresent_pte; > + > + if (is_rsvd_bits_set(&vcpu->arch.mmu, gpte, PT_PAGE_TABLE_LEVEL)) > + goto no_present; > + > + if (!is_present_gpte(gpte)) { > + if (!sp->unsync) > + nonpresent = shadow_notrap_nonpresent_pte; > + goto no_present; > + } > + > + if (!(gpte & PT_ACCESSED_MASK)) > + goto no_present; > + > + return false; > + > +no_present: > + if (drop_spte(vcpu->kvm, spte, nonpresent)) > + kvm_flush_remote_tlbs(vcpu->kvm); > + return true; > +} TLB flush not necessary. Looks fine otherwise, please rebase. -- 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