diff options
author | Mel Gorman <mgorman@suse.de> | 2012-01-12 20:19:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-12 23:13:09 -0500 |
commit | 7335084d446b83cbcb15da80497d03f0c1dc9e21 (patch) | |
tree | 1bc34f3cc12a4f6fce19b8eeaed52dc3e4202b5b | |
parent | 5013473152d1ac9d44d787fb02edda845fdf2cb3 (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.c | 8 |
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; |