aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHollis Blanchard <hollisb@us.ibm.com>2008-11-24 12:37:38 -0500
committerAvi Kivity <avi@redhat.com>2008-11-25 05:02:48 -0500
commitc30f8a6c6d74f67bc2107726cc61a1e7c71e9740 (patch)
treecc593db75efd62f917e949df78f4fabdcddc6938
parent0c0f40bdbe4ddb48ebecfb5c2b56eeb175a57c45 (diff)
KVM: ppc: stop leaking host memory on VM exit
When the VM exits, we must call put_page() for every page referenced in the shadow TLB. Without this patch, we usually leak 30-50 host pages (120 - 200 KiB with 4 KiB pages). The maximum number of pages leaked is the size of our shadow TLB, 64 pages. Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--arch/powerpc/include/asm/kvm_ppc.h2
-rw-r--r--arch/powerpc/kvm/44x_tlb.c8
-rw-r--r--arch/powerpc/kvm/powerpc.c1
3 files changed, 11 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index 8931ba729d2b..bb62ad876de3 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -104,4 +104,6 @@ static inline void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 new_pid)
104 } 104 }
105} 105}
106 106
107extern void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu);
108
107#endif /* __POWERPC_KVM_PPC_H__ */ 109#endif /* __POWERPC_KVM_PPC_H__ */
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c
index 2e227a412bc2..ad72c6f9811f 100644
--- a/arch/powerpc/kvm/44x_tlb.c
+++ b/arch/powerpc/kvm/44x_tlb.c
@@ -124,6 +124,14 @@ static void kvmppc_44x_shadow_release(struct kvm_vcpu *vcpu,
124 } 124 }
125} 125}
126 126
127void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu)
128{
129 int i;
130
131 for (i = 0; i <= tlb_44x_hwater; i++)
132 kvmppc_44x_shadow_release(vcpu, i);
133}
134
127void kvmppc_tlbe_set_modified(struct kvm_vcpu *vcpu, unsigned int i) 135void kvmppc_tlbe_set_modified(struct kvm_vcpu *vcpu, unsigned int i)
128{ 136{
129 vcpu->arch.shadow_tlb_mod[i] = 1; 137 vcpu->arch.shadow_tlb_mod[i] = 1;
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 90a6fc422b23..fda9baada132 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -238,6 +238,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
238 238
239void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) 239void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
240{ 240{
241 kvmppc_core_destroy_mmu(vcpu);
241} 242}
242 243
243/* Note: clearing MSR[DE] just means that the debug interrupt will not be 244/* Note: clearing MSR[DE] just means that the debug interrupt will not be