Add two patches to fix stalls in khugepaged (rhbz 735946)
This commit is contained in:
parent
3e1637b657
commit
922059227c
@ -0,0 +1,54 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,81 @@
|
|||||||
|
From c01043c9aa51a63bd01c60e53494ca4a7e994542 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mel Gorman <mgorman@suse.de>
|
||||||
|
Date: Fri, 7 Oct 2011 16:17:23 +0100
|
||||||
|
Subject: [PATCH 2/2] mm: Abort reclaim/compaction if compaction can proceed
|
||||||
|
|
||||||
|
If compaction can proceed, shrink_zones() stops doing any work but
|
||||||
|
the callers still shrink_slab(), raises the priority and potentially
|
||||||
|
sleeps. This patch aborts direct reclaim/compaction entirely if
|
||||||
|
compaction can proceed.
|
||||||
|
|
||||||
|
Signed-off-by: Mel Gorman <mgorman@suse.de>
|
||||||
|
---
|
||||||
|
mm/vmscan.c | 20 ++++++++++++++++----
|
||||||
|
1 files changed, 16 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
||||||
|
index 8c03534..b295a38 100644
|
||||||
|
--- a/mm/vmscan.c
|
||||||
|
+++ b/mm/vmscan.c
|
||||||
|
@@ -2000,14 +2000,19 @@ restart:
|
||||||
|
*
|
||||||
|
* If a zone is deemed to be full of pinned pages then just give it a light
|
||||||
|
* scan then give up on it.
|
||||||
|
+ *
|
||||||
|
+ * This function returns true if a zone is being reclaimed for a costly
|
||||||
|
+ * high-order allocation and compaction is either ready to begin or deferred.
|
||||||
|
+ * This indicates to the caller that it should retry the allocation or fail.
|
||||||
|
*/
|
||||||
|
-static void shrink_zones(int priority, struct zonelist *zonelist,
|
||||||
|
+static bool shrink_zones(int priority, struct zonelist *zonelist,
|
||||||
|
struct scan_control *sc)
|
||||||
|
{
|
||||||
|
struct zoneref *z;
|
||||||
|
struct zone *zone;
|
||||||
|
unsigned long nr_soft_reclaimed;
|
||||||
|
unsigned long nr_soft_scanned;
|
||||||
|
+ bool should_abort_reclaim = false;
|
||||||
|
|
||||||
|
for_each_zone_zonelist_nodemask(zone, z, zonelist,
|
||||||
|
gfp_zone(sc->gfp_mask), sc->nodemask) {
|
||||||
|
@@ -2025,12 +2030,15 @@ static void shrink_zones(int priority, struct zonelist *zonelist,
|
||||||
|
if (COMPACTION_BUILD) {
|
||||||
|
/*
|
||||||
|
* If we already have plenty of memory free
|
||||||
|
- * for compaction, don't free any more.
|
||||||
|
+ * for compaction in this zone , don't free any
|
||||||
|
+ * more.
|
||||||
|
*/
|
||||||
|
if (sc->order > PAGE_ALLOC_COSTLY_ORDER &&
|
||||||
|
(compaction_suitable(zone, sc->order) ||
|
||||||
|
- compaction_deferred(zone)))
|
||||||
|
+ compaction_deferred(zone))) {
|
||||||
|
+ should_abort_reclaim = true;
|
||||||
|
continue;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* This steals pages from memory cgroups over softlimit
|
||||||
|
@@ -2049,6 +2057,8 @@ static void shrink_zones(int priority, struct zonelist *zonelist,
|
||||||
|
|
||||||
|
shrink_zone(priority, zone, sc);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ return should_abort_reclaim;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool zone_reclaimable(struct zone *zone)
|
||||||
|
@@ -2113,7 +2123,9 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
||||||
|
sc->nr_scanned = 0;
|
||||||
|
if (!priority)
|
||||||
|
disable_swap_token(sc->mem_cgroup);
|
||||||
|
- shrink_zones(priority, zonelist, sc);
|
||||||
|
+ if (shrink_zones(priority, zonelist, sc))
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Don't shrink slabs when reclaiming memory from
|
||||||
|
* over limit cgroups
|
||||||
|
--
|
||||||
|
1.7.6.4
|
||||||
|
|
1
TODO
1
TODO
@ -17,6 +17,7 @@
|
|||||||
* add-macbookair41-keyboard.patch
|
* add-macbookair41-keyboard.patch
|
||||||
* ucvideo-fix-crash-when-linking-entities.patch
|
* ucvideo-fix-crash-when-linking-entities.patch
|
||||||
* mmc-Always-check-for-lower-base-frequency-quirk-for-.patch (also CC'd stable)
|
* mmc-Always-check-for-lower-base-frequency-quirk-for-.patch (also CC'd stable)
|
||||||
|
* 000[12]-mm-*
|
||||||
|
|
||||||
**** Other stuff that should go upstream (in decreasing likelyhood) ************************************
|
**** Other stuff that should go upstream (in decreasing likelyhood) ************************************
|
||||||
|
|
||||||
|
11
kernel.spec
11
kernel.spec
@ -741,6 +741,10 @@ Patch21001: arm-smsc-support-reading-mac-address-from-device-tree.patch
|
|||||||
#rhbz #722509
|
#rhbz #722509
|
||||||
Patch21002: mmc-Always-check-for-lower-base-frequency-quirk-for-.patch
|
Patch21002: mmc-Always-check-for-lower-base-frequency-quirk-for-.patch
|
||||||
|
|
||||||
|
#rhbz #735946
|
||||||
|
Patch21020: 0001-mm-vmscan-Limit-direct-reclaim-for-higher-order-allo.patch
|
||||||
|
Patch21021: 0002-mm-Abort-reclaim-compaction-if-compaction-can-procee.patch
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||||
@ -1358,6 +1362,10 @@ ApplyPatch mmc-Always-check-for-lower-base-frequency-quirk-for-.patch
|
|||||||
# utrace.
|
# utrace.
|
||||||
ApplyPatch utrace.patch
|
ApplyPatch utrace.patch
|
||||||
|
|
||||||
|
#rhbz #735946
|
||||||
|
ApplyPatch 0001-mm-vmscan-Limit-direct-reclaim-for-higher-order-allo.patch
|
||||||
|
ApplyPatch 0002-mm-Abort-reclaim-compaction-if-compaction-can-procee.patch
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -2066,6 +2074,9 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Oct 17 2011 Josh Boyer <jwboyer@redhat.com>
|
||||||
|
- Add two patches to fix stalls in khugepaged (rhbz 735946)
|
||||||
|
|
||||||
* Fri Oct 14 2011 Dave Jones <davej@redhat.com>
|
* Fri Oct 14 2011 Dave Jones <davej@redhat.com>
|
||||||
- Disable CONFIG_ACPI_PROCFS_POWER which is supposed to be going away soon.
|
- Disable CONFIG_ACPI_PROCFS_POWER which is supposed to be going away soon.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user