* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.