* [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path @ 2010-04-16 8:34 Xiao Guangrong 2010-04-16 8:35 ` [PATCH v3 2/2] KVM MMU: KVM MMU: cleanup for restart hlist walking Xiao Guangrong 2010-04-16 21:03 ` [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Marcelo Tosatti 0 siblings, 2 replies; 3+ messages in thread From: Xiao Guangrong @ 2010-04-16 8:34 UTC (permalink / raw) To: Avi Kivity; +Cc: Marcelo Tosatti, KVM list, LKML This patch fix: - calculate zapped page number properly in mmu_zap_unsync_children() - calculate freeed page number properly kvm_mmu_change_mmu_pages() - if zapped children page it shoud restart hlist walking Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> --- arch/x86/kvm/mmu.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index d217f9c..94c95ad 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1481,8 +1481,8 @@ static int mmu_zap_unsync_children(struct kvm *kvm, for_each_sp(pages, sp, parents, i) { kvm_mmu_zap_page(kvm, sp); mmu_pages_clear_parents(&parents); + zapped++; } - zapped += pages.nr; kvm_mmu_pages_init(parent, &parents, &pages); } @@ -1533,14 +1533,16 @@ void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages) */ if (used_pages > kvm_nr_mmu_pages) { - while (used_pages > kvm_nr_mmu_pages) { + while (used_pages > kvm_nr_mmu_pages && + !list_empty(&kvm->arch.active_mmu_pages)) { struct kvm_mmu_page *page; page = container_of(kvm->arch.active_mmu_pages.prev, struct kvm_mmu_page, link); - kvm_mmu_zap_page(kvm, page); + used_pages -= kvm_mmu_zap_page(kvm, page); used_pages--; } + kvm_nr_mmu_pages = used_pages; kvm->arch.n_free_mmu_pages = 0; } else @@ -1587,7 +1589,8 @@ static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) && !sp->role.invalid) { pgprintk("%s: zap %lx %x\n", __func__, gfn, sp->role.word); - kvm_mmu_zap_page(kvm, sp); + if (kvm_mmu_zap_page(kvm, sp)) + nn = bucket->first; } } } -- 1.6.1.2 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v3 2/2] KVM MMU: KVM MMU: cleanup for restart hlist walking 2010-04-16 8:34 [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Xiao Guangrong @ 2010-04-16 8:35 ` Xiao Guangrong 2010-04-16 21:03 ` [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Marcelo Tosatti 1 sibling, 0 replies; 3+ messages in thread From: Xiao Guangrong @ 2010-04-16 8:35 UTC (permalink / raw) To: Xiao Guangrong; +Cc: Avi Kivity, Marcelo Tosatti, KVM list, LKML Quote from Avi: |Just change the assignment to a 'goto restart;' please, |I don't like playing with list_for_each internals. Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> --- arch/x86/kvm/mmu.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 94c95ad..a2a9073 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1564,13 +1564,14 @@ static int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn) r = 0; index = kvm_page_table_hashfn(gfn); bucket = &kvm->arch.mmu_page_hash[index]; +restart: hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) if (sp->gfn == gfn && !sp->role.direct) { pgprintk("%s: gfn %lx role %x\n", __func__, gfn, sp->role.word); r = 1; if (kvm_mmu_zap_page(kvm, sp)) - n = bucket->first; + goto restart; } return r; } @@ -1584,13 +1585,14 @@ static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) index = kvm_page_table_hashfn(gfn); bucket = &kvm->arch.mmu_page_hash[index]; +restart: hlist_for_each_entry_safe(sp, node, nn, bucket, hash_link) { if (sp->gfn == gfn && !sp->role.direct && !sp->role.invalid) { pgprintk("%s: zap %lx %x\n", __func__, gfn, sp->role.word); if (kvm_mmu_zap_page(kvm, sp)) - nn = bucket->first; + goto restart; } } } @@ -2670,6 +2672,8 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, } index = kvm_page_table_hashfn(gfn); bucket = &vcpu->kvm->arch.mmu_page_hash[index]; + +restart: hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) { if (sp->gfn != gfn || sp->role.direct || sp->role.invalid) continue; @@ -2690,7 +2694,7 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, pgprintk("misaligned: gpa %llx bytes %d role %x\n", gpa, bytes, sp->role.word); if (kvm_mmu_zap_page(vcpu->kvm, sp)) - n = bucket->first; + goto restart; ++vcpu->kvm->stat.mmu_flooded; continue; } @@ -2899,10 +2903,11 @@ void kvm_mmu_zap_all(struct kvm *kvm) struct kvm_mmu_page *sp, *node; spin_lock(&kvm->mmu_lock); +restart: list_for_each_entry_safe(sp, node, &kvm->arch.active_mmu_pages, link) if (kvm_mmu_zap_page(kvm, sp)) - node = container_of(kvm->arch.active_mmu_pages.next, - struct kvm_mmu_page, link); + goto restart; + spin_unlock(&kvm->mmu_lock); kvm_flush_remote_tlbs(kvm); -- 1.6.1.2 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path 2010-04-16 8:34 [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Xiao Guangrong 2010-04-16 8:35 ` [PATCH v3 2/2] KVM MMU: KVM MMU: cleanup for restart hlist walking Xiao Guangrong @ 2010-04-16 21:03 ` Marcelo Tosatti 1 sibling, 0 replies; 3+ messages in thread From: Marcelo Tosatti @ 2010-04-16 21:03 UTC (permalink / raw) To: Xiao Guangrong; +Cc: Avi Kivity, KVM list, LKML On Fri, Apr 16, 2010 at 04:34:42PM +0800, Xiao Guangrong wrote: > This patch fix: > > - calculate zapped page number properly in mmu_zap_unsync_children() > - calculate freeed page number properly kvm_mmu_change_mmu_pages() > - if zapped children page it shoud restart hlist walking > > Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Applied both, thanks. ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-04-16 21:04 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-04-16 8:34 [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Xiao Guangrong 2010-04-16 8:35 ` [PATCH v3 2/2] KVM MMU: KVM MMU: cleanup for restart hlist walking Xiao Guangrong 2010-04-16 21:03 ` [PATCH v3 1/2] KVM MMU: fix kvm_mmu_zap_page() and its calling path Marcelo Tosatti
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox