LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Mel Gorman <mel@csn.ul.ie>
To: akpm@linux-foundation.org
Cc: Mel Gorman <mel@csn.ul.ie>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH 7/12] Drain per-cpu lists when high-order allocations fail
Date: Thu,  1 Mar 2007 10:04:50 +0000 (GMT)	[thread overview]
Message-ID: <20070301100450.29753.26488.sendpatchset@skynet.skynet.ie> (raw)
In-Reply-To: <20070301100229.29753.86342.sendpatchset@skynet.skynet.ie>


Per-cpu pages can accidentally cause fragmentation because they are free, but
pinned pages in an otherwise contiguous block.  When this patch is applied,
the per-cpu caches are drained after the direct-reclaim is entered if the
requested order is greater than 0. It simply reuses the code used by suspend
and hotplug.

Signed-off-by: Mel Gorman <mel@csn.ul.ie>
---

 page_alloc.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletion(-)

diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.20-mm2-006_configurable/mm/page_alloc.c linux-2.6.20-mm2-007_drainpercpu/mm/page_alloc.c
--- linux-2.6.20-mm2-006_configurable/mm/page_alloc.c	2007-02-20 18:33:41.000000000 +0000
+++ linux-2.6.20-mm2-007_drainpercpu/mm/page_alloc.c	2007-02-20 18:35:52.000000000 +0000
@@ -916,7 +916,9 @@ void mark_free_pages(struct zone *zone)
 
 	spin_unlock_irqrestore(&zone->lock, flags);
 }
+#endif /* CONFIG_PM */
 
+#if defined(CONFIG_PM) || defined(CONFIG_PAGE_GROUP_BY_MOBILITY)
 /*
  * Spill all of this CPU's per-cpu pages back into the buddy allocator.
  */
@@ -928,7 +930,28 @@ void drain_local_pages(void)
 	__drain_pages(smp_processor_id());
 	local_irq_restore(flags);	
 }
-#endif /* CONFIG_PM */
+
+void smp_drain_local_pages(void *arg)
+{
+	drain_local_pages();
+}
+
+/*
+ * Spill all the per-cpu pages from all CPUs back into the buddy allocator
+ */
+void drain_all_local_pages(void)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+	__drain_pages(smp_processor_id());
+	local_irq_restore(flags);
+
+	smp_call_function(smp_drain_local_pages, NULL, 0, 1);
+}
+#else
+void drain_all_local_pages(void) {}
+#endif /* CONFIG_PM || CONFIG_PAGE_GROUP_BY_MOBILITY */
 
 /*
  * Free a 0-order page
@@ -1557,6 +1580,9 @@ nofail_alloc:
 
 	cond_resched();
 
+	if (order != 0)
+		drain_all_local_pages();
+
 	if (likely(did_some_progress)) {
 		page = get_page_from_freelist(gfp_mask, order,
 						zonelist, alloc_flags);

  parent reply	other threads:[~2007-03-01 10:05 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-01 10:02 [PATCH 0/12] Group pages of related mobility together to reduce external fragmentation v28 Mel Gorman
2007-03-01 10:02 ` [PATCH 1/12] Add a bitmap that is used to track flags affecting a block of pages Mel Gorman
2007-03-01 10:03 ` [PATCH 2/12] Add __GFP_MOVABLE for callers to flag allocations from high memory that may be migrated Mel Gorman
2007-03-01 10:03 ` [PATCH 3/12] Add __GFP_MOVABLE for callers to flag allocations from low " Mel Gorman
2007-03-01 10:03 ` [PATCH 4/12] Split the free lists for movable and unmovable allocations Mel Gorman
2007-03-01 10:04 ` [PATCH 5/12] Choose pages from the per-cpu list based on migration type Mel Gorman
2007-03-01 10:04 ` [PATCH 6/12] Add a configure option to group pages by mobility Mel Gorman
2007-03-01 10:04 ` Mel Gorman [this message]
2007-03-01 10:05 ` [PATCH 8/12] Move free pages between lists on steal Mel Gorman
2007-03-01 10:05 ` [PATCH 9/12] Group short-lived and reclaimable kernel allocations Mel Gorman
2007-03-01 10:05 ` [PATCH 10/12] Group high-order atomic allocations Mel Gorman
2007-03-01 10:06 ` [PATCH 11/12] Bias the placement of kernel pages at lower PFNs Mel Gorman
2007-03-01 10:06 ` [PATCH 12/12] Be more agressive about stealing when MIGRATE_RECLAIMABLE allocations fallback Mel Gorman

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=20070301100450.29753.26488.sendpatchset@skynet.skynet.ie \
    --to=mel@csn.ul.ie \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --subject='Re: [PATCH 7/12] Drain per-cpu lists when high-order allocations fail' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).