From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH 3/4] Swapping Date: Sat, 13 Oct 2007 19:36:22 -0500 Message-ID: <47116486.4070609@codemonkey.ws> References: <47102919.6070802@qumranet.com> <471124D4.3090901@codemonkey.ws> <471126D9.4030204@qumranet.com> <47112D66.4020500@qumranet.com> <47115207.3090909@codemonkey.ws> <4711542F.2060306@qumranet.com> <4711563D.8020000@codemonkey.ws> <471156D9.3030700@qumranet.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070302060709090701000803" Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: Izik Eidus Return-path: In-Reply-To: <471156D9.3030700-atKUWr5tajBWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------070302060709090701000803 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Izik Eidus wrote: > Anthony Liguori wrote: >> >> I think it's just a matter of calling do_mmap() with the appropriate >> parameters. It looks likes there's some drivers call do_mmap() >> directly. >> > yea, i think you right, this is excellent idea!, when we will merge > the swapping to kvm, we will add swapping support to older userspace. Here's a patch against your series. The memset in kvmctl ends up making the guest use all physical memory to start off with but I did confirm that once the system is under memory pressure, the guest's memory becomes swappable. Of course, it's quite painful :-) A nice thing though is that a lot of the code becomes a bit cleaner and we can eliminate the phys_mem array entirely. Regards, Anthony Liguori --------------070302060709090701000803 Content-Type: text/x-patch; name="swap-old-userspace.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="swap-old-userspace.diff" Subject: [PATCH] Allocate userspace memory for older userspace From: Anthony Liguori Cc: Avi Kivity Cc: Izik Eidus Allocate a userspace buffer for older userspaces. Also eliminate phys_mem buffer. The memset() in kvmctl really kills initial memory usage but swapping does even with old userspaces. Signed-off-by: Anthony Liguori diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index 74b427f..c904ea3 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h @@ -405,10 +405,8 @@ struct kvm_memory_slot { gfn_t base_gfn; unsigned long npages; unsigned long flags; - struct page **phys_mem; unsigned long *rmap; unsigned long *dirty_bitmap; - int user_alloc; /* user allocated memory */ unsigned long userspace_addr; }; diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index f58d49b..aa5666f 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -319,34 +320,18 @@ static struct kvm *kvm_create_vm(void) return kvm; } -static void kvm_free_kernel_physmem(struct kvm_memory_slot *free) -{ - int i; - - for (i = 0; i < free->npages; ++i) - if (free->phys_mem[i]) - __free_page(free->phys_mem[i]); -} - /* * Free any memory in @free but not in @dont. */ static void kvm_free_physmem_slot(struct kvm_memory_slot *free, struct kvm_memory_slot *dont) { - if (!dont || free->phys_mem != dont->phys_mem) - if (free->phys_mem) { - if (!free->user_alloc) - kvm_free_kernel_physmem(free); - vfree(free->phys_mem); - } if (!dont || free->rmap != dont->rmap) vfree(free->rmap); if (!dont || free->dirty_bitmap != dont->dirty_bitmap) vfree(free->dirty_bitmap); - free->phys_mem = NULL; free->npages = 0; free->dirty_bitmap = NULL; } @@ -731,10 +716,6 @@ static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, goto out_unlock; } - /* Deallocate if slot is being removed */ - if (!npages) - new.phys_mem = NULL; - /* Free page dirty bitmap if unneeded */ if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES)) new.dirty_bitmap = NULL; @@ -742,29 +723,27 @@ static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, r = -ENOMEM; /* Allocate if a slot is being created */ - if (npages && !new.phys_mem) { - new.phys_mem = vmalloc(npages * sizeof(struct page *)); - - if (!new.phys_mem) - goto out_unlock; - + if (npages) { new.rmap = vmalloc(npages * sizeof(struct page *)); if (!new.rmap) goto out_unlock; - memset(new.phys_mem, 0, npages * sizeof(struct page *)); memset(new.rmap, 0, npages * sizeof(*new.rmap)); - if (user_alloc) { - new.user_alloc = 1; + + if (user_alloc) new.userspace_addr = mem->userspace_addr; - } else { - for (i = 0; i < npages; ++i) { - new.phys_mem[i] = alloc_page(GFP_HIGHUSER - | __GFP_ZERO); - if (!new.phys_mem[i]) - goto out_unlock; - } + else { + down_write(¤t->mm->mmap_sem); + new.userspace_addr = do_mmap(NULL, 0, + npages * PAGE_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, + 0); + up_write(¤t->mm->mmap_sem); + + if (new.userspace_addr > -1024UL) + goto out_unlock; } } @@ -1029,6 +1008,8 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) { struct kvm_memory_slot *slot; + struct page *page[1]; + int npages; gfn = unalias_gfn(kvm, gfn); slot = __gfn_to_memslot(kvm, gfn); @@ -1036,24 +1017,19 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) get_page(bad_page); return bad_page; } - if (slot->user_alloc) { - struct page *page[1]; - int npages; - - down_read(¤t->mm->mmap_sem); - npages = get_user_pages(current, current->mm, - slot->userspace_addr - + (gfn - slot->base_gfn) * PAGE_SIZE, 1, - 1, 0, page, NULL); - up_read(¤t->mm->mmap_sem); - if (npages != 1) { - get_page(bad_page); - return bad_page; - } - return page[0]; + + down_read(¤t->mm->mmap_sem); + npages = get_user_pages(current, current->mm, + slot->userspace_addr + + (gfn - slot->base_gfn) * PAGE_SIZE, 1, + 1, 0, page, NULL); + up_read(¤t->mm->mmap_sem); + if (npages != 1) { + get_page(bad_page); + return bad_page; } - get_page(slot->phys_mem[gfn - slot->base_gfn]); - return slot->phys_mem[gfn - slot->base_gfn]; + + return page[0]; } EXPORT_SYMBOL_GPL(gfn_to_page); --------------070302060709090701000803 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ --------------070302060709090701000803 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------070302060709090701000803--