linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Lameter <clameter@sgi.com>
To: Andi Kleen <andi@firstfloor.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [13/14] vcompound: Use vcompound for swap_map
Date: Mon, 24 Mar 2008 12:54:54 -0700 (PDT)	[thread overview]
Message-ID: <Pine.LNX.4.64.0803241253250.4218@schroedinger.engr.sgi.com> (raw)
In-Reply-To: <8763vfixb8.fsf@basil.nowhere.org>

On Fri, 21 Mar 2008, Andi Kleen wrote:

> But I used a simple trick to avoid the waste problem: it allocated a
> continuous range rounded up to the next page-size order and then freed
> the excess pages back into the page allocator. That was called
> alloc_exact(). If you replace vmalloc with alloc_pages you should
> use something like that too I think.

One way of dealing with it would be to define an additional allocation 
variant that allows the limiting of the loss? I noted that both the swap
and the wait tables vary significantly between allocations. So we could 
specify an upper boundary of a loss that is acceptable. If too much memory
would be lost then use vmalloc unconditionally.

---
 include/linux/vmalloc.h |   12 ++++++++----
 mm/page_alloc.c         |    4 ++--
 mm/swapfile.c           |    4 ++--
 mm/vmalloc.c            |   34 ++++++++++++++++++++++++++++++++++
 4 files changed, 46 insertions(+), 8 deletions(-)

Index: linux-2.6.25-rc5-mm1/include/linux/vmalloc.h
===================================================================
--- linux-2.6.25-rc5-mm1.orig/include/linux/vmalloc.h	2008-03-24 12:51:47.457231129 -0700
+++ linux-2.6.25-rc5-mm1/include/linux/vmalloc.h	2008-03-24 12:52:05.449313572 -0700
@@ -88,14 +88,18 @@ extern void free_vm_area(struct vm_struc
 /*
  * Support for virtual compound pages.
  *
- * Calls to vcompound alloc will result in the allocation of normal compound
- * pages unless memory is fragmented.  If insufficient physical linear memory
- * is available then a virtually contiguous area of memory will be created
- * using the vmalloc functionality.
+ * Calls to vcompound_alloc and friends will result in the allocation of
+ * a normal physically contiguous compound page unless memory is fragmented.
+ * If insufficient physical linear memory is available then a virtually
+ * contiguous area of memory will be created using vmalloc.
  */
 struct page *alloc_vcompound(gfp_t flags, int order);
+struct page *alloc_vcompound_maxloss(gfp_t flags, unsigned long size,
+					unsigned long maxloss);
 void free_vcompound(struct page *);
 void *__alloc_vcompound(gfp_t flags, int order);
+void *__alloc_vcompound_maxloss(gfp_t flags, unsigned long size,
+					unsigned long maxloss);
 void __free_vcompound(void *addr);
 struct page *vcompound_head_page(const void *x);
 
Index: linux-2.6.25-rc5-mm1/mm/vmalloc.c
===================================================================
--- linux-2.6.25-rc5-mm1.orig/mm/vmalloc.c	2008-03-24 12:51:47.485231279 -0700
+++ linux-2.6.25-rc5-mm1/mm/vmalloc.c	2008-03-24 12:52:05.453313419 -0700
@@ -1198,3 +1198,37 @@ void *__alloc_vcompound(gfp_t flags, int
 
 	return NULL;
 }
+
+/*
+ * Functions to avoid loosing memory because of the rounding up to
+ * power of two sizes for compound page allocation. If the loss would
+ * be too great then use vmalloc regardless of the fragmentation
+ * situation.
+ */
+struct page *alloc_vcompound_maxloss(gfp_t flags, unsigned long size,
+							unsigned long maxloss)
+{
+	int order = get_order(size);
+	unsigned long loss = (PAGE_SIZE << order) - size;
+	void *addr;
+
+	if (loss < maxloss)
+		return alloc_vcompound(flags, order);
+
+	addr = __vmalloc(size, flags, PAGE_KERNEL);
+	if (!addr)
+		return NULL;
+	return vmalloc_to_page(addr);
+}
+
+void *__alloc_vcompound_maxloss(gfp_t flags, unsigned long size,
+							unsigned long maxloss)
+{
+	int order = get_order(size);
+	unsigned long loss = (PAGE_SIZE << order) - size;
+
+	if (loss < maxloss)
+		return __alloc_vcompound(flags, order);
+
+	return __vmalloc(size, flags, PAGE_KERNEL);
+}
Index: linux-2.6.25-rc5-mm1/mm/swapfile.c
===================================================================
--- linux-2.6.25-rc5-mm1.orig/mm/swapfile.c	2008-03-24 12:52:05.441314302 -0700
+++ linux-2.6.25-rc5-mm1/mm/swapfile.c	2008-03-24 12:52:05.453313419 -0700
@@ -1636,8 +1636,8 @@ asmlinkage long sys_swapon(const char __
 			goto bad_swap;
 
 		/* OK, set up the swap map and apply the bad block list */
-		if (!(p->swap_map = __alloc_vcompound(GFP_KERNEL | __GFP_ZERO,
-					get_order(maxpages * sizeof(short))))) {
+		if (!(p->swap_map = __alloc_vcompound_maxloss(GFP_KERNEL | __GFP_ZERO,
+					maxpages * sizeof(short))), 16 * PAGE_SIZE) {
 			error = -ENOMEM;
 			goto bad_swap;
 		}
Index: linux-2.6.25-rc5-mm1/mm/page_alloc.c
===================================================================
--- linux-2.6.25-rc5-mm1.orig/mm/page_alloc.c	2008-03-24 12:52:05.389313168 -0700
+++ linux-2.6.25-rc5-mm1/mm/page_alloc.c	2008-03-24 12:52:07.493322559 -0700
@@ -2866,8 +2866,8 @@ int zone_wait_table_init(struct zone *zo
 		 * To use this new node's memory, further consideration will be
 		 * necessary.
 		 */
-		zone->wait_table = __alloc_vcompound(GFP_KERNEL,
-						get_order(alloc_size));
+		zone->wait_table = __alloc_vcompound_maxloss(GFP_KERNEL,
+				alloc_size, 32 * PAGE_SIZE);
 	}
 	if (!zone->wait_table)
 		return -ENOMEM;

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2008-03-24 19:54 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-21  6:17 [00/14] Virtual Compound Page Support V3 Christoph Lameter
2008-03-21  6:17 ` [01/14] vcompound: Return page array on vunmap Christoph Lameter
2008-03-21  6:17 ` [02/14] vcompound: pageflags: Add PageVcompound() Christoph Lameter
2008-03-21  6:17 ` [03/14] vmallocinfo: Support display of vcompound for a virtual compound page Christoph Lameter
2008-03-21  7:55   ` Eric Dumazet
2008-03-21 17:32     ` Christoph Lameter
2008-03-21  6:17 ` [04/14] vcompound: Core piece Christoph Lameter
2008-03-22 12:10   ` KOSAKI Motohiro
2008-03-24 18:28     ` Christoph Lameter
2008-03-21  6:17 ` [05/14] vcompound: Debugging aid Christoph Lameter
2008-03-21  6:17 ` [06/14] vcompound: Virtual fallback for sparsemem Christoph Lameter
2008-03-21  6:17 ` [07/14] vcompound: bit waitqueue support Christoph Lameter
2008-03-21  6:17 ` [08/14] vcompound: Fallback for zone wait table Christoph Lameter
2008-03-21  6:17 ` [09/14] vcompound: crypto: Fallback for temporary order 2 allocation Christoph Lameter
2008-03-21  6:17 ` [10/14] vcompound: slub: Use for buffer to correlate allocation addresses Christoph Lameter
2008-03-21  6:17 ` [11/14] vcompound: Fallbacks for order 1 stack allocations on IA64 and x86 Christoph Lameter
2008-03-21  7:25   ` David Miller, Christoph Lameter
2008-03-21  8:39     ` Ingo Molnar
2008-03-21 17:33       ` Christoph Lameter
2008-03-21 19:02         ` Ingo Molnar
2008-03-21 19:04           ` Christoph Lameter
2008-03-21 17:40     ` Christoph Lameter
2008-03-21 21:57       ` David Miller, Christoph Lameter
2008-03-24 18:27         ` Christoph Lameter
2008-03-24 20:37           ` larger default page sizes David Miller, Christoph Lameter
2008-03-24 21:05             ` Christoph Lameter
2008-03-24 21:43               ` David Miller, Christoph Lameter
2008-03-25 17:48                 ` Christoph Lameter
2008-03-25 23:22                   ` David Miller, Christoph Lameter
2008-03-25 23:41                     ` Peter Chubb
2008-03-25 23:49                       ` David Miller, Peter Chubb
2008-03-26  0:25                         ` Peter Chubb
2008-03-26  0:31                           ` David Miller, Peter Chubb
2008-03-26  0:34                       ` David Mosberger-Tang
2008-03-26  0:39                         ` David Miller, David Mosberger-Tang
2008-03-26  0:57                         ` Peter Chubb
2008-03-26  4:16                           ` John Marvin
2008-03-26  4:36                             ` David Miller, John Marvin
2008-03-24 21:25             ` Luck, Tony
2008-03-24 21:46               ` David Miller, Luck, Tony
2008-03-25  3:29             ` Paul Mackerras
2008-03-25  4:15               ` David Miller, Paul Mackerras
2008-03-25 11:50                 ` Paul Mackerras
2008-03-25 23:32                   ` David Miller, Paul Mackerras
2008-03-25 23:49                     ` Luck, Tony
2008-03-26  0:16                       ` David Miller, Luck, Tony
2008-03-26 15:54                       ` Nish Aravamudan
2008-03-26 17:05                         ` Luck, Tony
2008-03-26 18:54                           ` Mel Gorman
2008-03-25 12:05               ` Andi Kleen
2008-03-25 21:27                 ` Paul Mackerras
2008-03-26  5:24                 ` Paul Mackerras
2008-03-26 15:59                   ` Linus Torvalds
2008-03-27  1:08                     ` Paul Mackerras
2008-03-26 17:56                   ` Christoph Lameter
2008-03-26 23:21                     ` David Miller, Christoph Lameter
2008-03-27  3:00                     ` Paul Mackerras
2008-03-25 18:27               ` Dave Hansen
2008-03-24 21:13           ` [11/14] vcompound: Fallbacks for order 1 stack allocations on IA64 and x86 Luck, Tony
2008-03-25 17:42             ` Christoph Lameter
2008-03-25 19:09               ` Luck, Tony
2008-03-25 19:25                 ` Christoph Lameter
2008-03-21 22:30   ` Andi Kleen
2008-03-24 19:53     ` Christoph Lameter
2008-03-25  7:51       ` Andi Kleen
2008-03-25 17:55         ` Christoph Lameter
2008-03-25 18:07           ` Andi Kleen
2008-03-21  6:17 ` [12/14] vcompound: Avoid vmalloc in e1000 driver Christoph Lameter
2008-03-21 17:27   ` Kok, Auke
2008-03-21  6:17 ` [13/14] vcompound: Use vcompound for swap_map Christoph Lameter
2008-03-21 21:25   ` Andi Kleen
2008-03-21 21:33     ` Christoph Lameter
2008-03-24 19:54     ` Christoph Lameter [this message]
2008-03-25  7:52       ` Andi Kleen
2008-03-25 17:45         ` Christoph Lameter
2008-03-25 17:55           ` Andi Kleen
2008-03-25 17:51             ` Christoph Lameter
2008-03-21  6:17 ` [14/14] vcompound: Avoid vmalloc for ehash_locks Christoph Lameter
2008-03-21  7:02   ` Eric Dumazet
2008-03-21  7:03     ` Christoph Lameter
2008-03-21  7:31       ` David Miller, Christoph Lameter
2008-03-21  7:42         ` Eric Dumazet
2008-03-21  7:31     ` David Miller, Eric Dumazet
2008-03-21 17:31       ` Christoph Lameter
2008-03-22 18:40 ` [00/14] Virtual Compound Page Support V3 Arjan van de Ven
2008-03-24 18:31   ` Christoph Lameter
2008-03-24 19:29     ` Christoph Lameter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0803241253250.4218@schroedinger.engr.sgi.com \
    --to=clameter@sgi.com \
    --cc=andi@firstfloor.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox