From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 2/5] KVM: MMU: split the operations of kvm_mmu_zap_page() Date: Sun, 30 May 2010 16:16:51 +0300 Message-ID: <4C026543.20608@redhat.com> References: <4C025BDC.1020304@cn.fujitsu.com> <4C025C24.9010200@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , LKML , KVM list To: Xiao Guangrong Return-path: In-Reply-To: <4C025C24.9010200@cn.fujitsu.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org On 05/30/2010 03:37 PM, Xiao Guangrong wrote: > Using kvm_mmu_prepare_zap_page() and kvm_mmu_commit_zap_page() to > split kvm_mmu_zap_page() function, then we can: > > - traverse hlist safely > - easily to gather remote tlb flush which occurs during page zapped > > > +static int kvm_mmu_prepare_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) > +{ > + int ret; > + > + trace_kvm_mmu_zap_page(sp); > + ++kvm->stat.mmu_shadow_zapped; > + ret = mmu_zap_unsync_children(kvm, sp); > + kvm_mmu_page_unlink_children(kvm, sp); > + kvm_mmu_unlink_parents(kvm, sp); > + if (!sp->role.invalid&& !sp->role.direct) > + unaccount_shadowed(kvm, sp->gfn); > + if (sp->unsync) > + kvm_unlink_unsync_page(kvm, sp); > + if (!sp->root_count) > + /* Count self */ > + ret++; > + else > + kvm_reload_remote_mmus(kvm); > + > + sp->role.invalid = 1; > + list_move(&sp->link,&kvm->arch.invalid_mmu_pages); > + kvm_mmu_reset_last_pte_updated(kvm); > + return ret; > +} > + > +static void kvm_mmu_commit_zap_page(struct kvm *kvm) > +{ > + struct kvm_mmu_page *sp, *n; > + > + if (list_empty(&kvm->arch.invalid_mmu_pages)) > + return; > + > + kvm_flush_remote_tlbs(kvm); > + list_for_each_entry_safe(sp, n,&kvm->arch.invalid_mmu_pages, link) { > + WARN_ON(!sp->role.invalid); > + if (!sp->root_count) > + kvm_mmu_free_page(kvm, sp); > + } > +} > + > You're adding two new functions but not using them here? Possibly in the old kvm_mmu_zap_page()? > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 5e5cd8d..225c3c4 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -5331,6 +5331,7 @@ struct kvm *kvm_arch_create_vm(void) > } > > INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); > + INIT_LIST_HEAD(&kvm->arch.invalid_mmu_pages); > INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); > This is a good idea, but belongs in a separate patch? We can use it to reclaim invalid pages before allocating new ones. -- error compiling committee.c: too many arguments to function