On Wed, Apr 17, 2013 at 10:54:32AM -0700, Andrew Honig wrote: > > If userspace creates and destroys multiple VMs within the same process > we leak 20k of memory in the userspace process context per VM. This > patch frees the memory in kvm_arch_destroy_vm. If the process exits > without closing the VM file descriptor or the file descriptor has been > shared with another process then we don't need to free the memory. > > Signed-off-by: Andrew Honig <ahonig@xxxxxxxxxx> > --- > arch/x86/kvm/x86.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index e172132..e93e16b 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -6811,6 +6811,23 @@ void kvm_arch_sync_events(struct kvm *kvm) > > void kvm_arch_destroy_vm(struct kvm *kvm) > { > + if (current->mm == kvm->mm) { > + /* > + * Free memory regions allocated on behalf of userspace, > + * unless the the memory map has changed due to process exit > + * or fd copying. > + */ > + struct kvm_userspace_memory_region mem; > + memset(&mem, 0, sizeof(mem)); > + mem.slot = APIC_ACCESS_PAGE_PRIVATE_MEMSLOT; > + kvm_set_memory_region(kvm, &mem, 0); > + > + mem.slot = IDENTITY_PAGETABLE_PRIVATE_MEMSLOT; > + kvm_set_memory_region(kvm, &mem, 0); > + > + mem.slot = TSS_PRIVATE_MEMSLOT; > + kvm_set_memory_region(kvm, &mem, 0); You should code it against next branch. kvm_set_memory_region() has only two parameters there. > + } > kvm_iommu_unmap_guest(kvm); > kfree(kvm->arch.vpic); > kfree(kvm->arch.vioapic); > -- > 1.7.10.4 > > -- > 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 -- Gleb. -- 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