55 lines
1.9 KiB
Diff
55 lines
1.9 KiB
Diff
|
From 6b7025ea927d290a59d2772828435c1893f0267f Mon Sep 17 00:00:00 2001
|
||
|
From: Rik van Riel <riel@redhat.com>
|
||
|
Date: Fri, 7 Oct 2011 16:17:22 +0100
|
||
|
Subject: [PATCH 1/2] mm: vmscan: Limit direct reclaim for higher order
|
||
|
allocations
|
||
|
|
||
|
When suffering from memory fragmentation due to unfreeable pages,
|
||
|
THP page faults will repeatedly try to compact memory. Due to the
|
||
|
unfreeable pages, compaction fails.
|
||
|
|
||
|
Needless to say, at that point page reclaim also fails to create
|
||
|
free contiguous 2MB areas. However, that doesn't stop the current
|
||
|
code from trying, over and over again, and freeing a minimum of 4MB
|
||
|
(2UL << sc->order pages) at every single invocation.
|
||
|
|
||
|
This resulted in my 12GB system having 2-3GB free memory, a
|
||
|
corresponding amount of used swap and very sluggish response times.
|
||
|
|
||
|
This can be avoided by having the direct reclaim code not reclaim from
|
||
|
zones that already have plenty of free memory available for compaction.
|
||
|
|
||
|
If compaction still fails due to unmovable memory, doing additional
|
||
|
reclaim will only hurt the system, not help.
|
||
|
|
||
|
Signed-off-by: Rik van Riel <riel@redhat.com>
|
||
|
Signed-off-by: Mel Gorman <mgorman@suse.de>
|
||
|
---
|
||
|
mm/vmscan.c | 10 ++++++++++
|
||
|
1 files changed, 10 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
||
|
index 6072d74..8c03534 100644
|
||
|
--- a/mm/vmscan.c
|
||
|
+++ b/mm/vmscan.c
|
||
|
@@ -2022,6 +2022,16 @@ static void shrink_zones(int priority, struct zonelist *zonelist,
|
||
|
continue;
|
||
|
if (zone->all_unreclaimable && priority != DEF_PRIORITY)
|
||
|
continue; /* Let kswapd poll it */
|
||
|
+ if (COMPACTION_BUILD) {
|
||
|
+ /*
|
||
|
+ * If we already have plenty of memory free
|
||
|
+ * for compaction, don't free any more.
|
||
|
+ */
|
||
|
+ if (sc->order > PAGE_ALLOC_COSTLY_ORDER &&
|
||
|
+ (compaction_suitable(zone, sc->order) ||
|
||
|
+ compaction_deferred(zone)))
|
||
|
+ continue;
|
||
|
+ }
|
||
|
/*
|
||
|
* This steals pages from memory cgroups over softlimit
|
||
|
* and returns the number of reclaimed pages and
|
||
|
--
|
||
|
1.7.6.4
|
||
|
|