aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2012-01-12 20:19:33 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-12 23:13:09 -0500
commit7335084d446b83cbcb15da80497d03f0c1dc9e21 (patch)
tree1bc34f3cc12a4f6fce19b8eeaed52dc3e4202b5b
parent5013473152d1ac9d44d787fb02edda845fdf2cb3 (diff)
mm: vmscan: do not OOM if aborting reclaim to start compaction
During direct reclaim it is possible that reclaim will be aborted so that compaction can be attempted to satisfy a high-order allocation. If this decision is made before any pages are reclaimed, it is possible that 0 is returned to the page allocator potentially triggering an OOM. This has not been observed but it is a possibility so this patch addresses it. Signed-off-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: Dave Jones <davej@redhat.com> Cc: Jan Kara <jack@suse.cz> Cc: Andy Isaacson <adi@hexapodia.org> Cc: Nai Xia <nai.xia@gmail.com> Cc: Johannes Weiner <jweiner@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/vmscan.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 866ab27c52a5..cb68c53db4ec 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2263,6 +2263,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
2263 struct zoneref *z; 2263 struct zoneref *z;
2264 struct zone *zone; 2264 struct zone *zone;
2265 unsigned long writeback_threshold; 2265 unsigned long writeback_threshold;
2266 bool should_abort_reclaim;
2266 2267
2267 get_mems_allowed(); 2268 get_mems_allowed();
2268 delayacct_freepages_start(); 2269 delayacct_freepages_start();
@@ -2274,7 +2275,8 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
2274 sc->nr_scanned = 0; 2275 sc->nr_scanned = 0;
2275 if (!priority) 2276 if (!priority)
2276 disable_swap_token(sc->target_mem_cgroup); 2277 disable_swap_token(sc->target_mem_cgroup);
2277 if (shrink_zones(priority, zonelist, sc)) 2278 should_abort_reclaim = shrink_zones(priority, zonelist, sc);
2279 if (should_abort_reclaim)
2278 break; 2280 break;
2279 2281
2280 /* 2282 /*
@@ -2342,6 +2344,10 @@ out:
2342 if (oom_killer_disabled) 2344 if (oom_killer_disabled)
2343 return 0; 2345 return 0;
2344 2346
2347 /* Aborting reclaim to try compaction? don't OOM, then */
2348 if (should_abort_reclaim)
2349 return 1;
2350
2345 /* top priority shrink_zones still had more to do? don't OOM, then */ 2351 /* top priority shrink_zones still had more to do? don't OOM, then */
2346 if (global_reclaim(sc) && !all_unreclaimable(zonelist, sc)) 2352 if (global_reclaim(sc) && !all_unreclaimable(zonelist, sc))
2347 return 1; 2353 return 1;