|
@@ -2263,6 +2263,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
|
|
struct zoneref *z;
|
|
|
struct zone *zone;
|
|
|
unsigned long writeback_threshold;
|
|
|
+ bool should_abort_reclaim;
|
|
|
|
|
|
get_mems_allowed();
|
|
|
delayacct_freepages_start();
|
|
@@ -2274,7 +2275,8 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
|
|
sc->nr_scanned = 0;
|
|
|
if (!priority)
|
|
|
disable_swap_token(sc->target_mem_cgroup);
|
|
|
- if (shrink_zones(priority, zonelist, sc))
|
|
|
+ should_abort_reclaim = shrink_zones(priority, zonelist, sc);
|
|
|
+ if (should_abort_reclaim)
|
|
|
break;
|
|
|
|
|
|
/*
|
|
@@ -2342,6 +2344,10 @@ out:
|
|
|
if (oom_killer_disabled)
|
|
|
return 0;
|
|
|
|
|
|
+ /* Aborting reclaim to try compaction? don't OOM, then */
|
|
|
+ if (should_abort_reclaim)
|
|
|
+ return 1;
|
|
|
+
|
|
|
/* top priority shrink_zones still had more to do? don't OOM, then */
|
|
|
if (global_reclaim(sc) && !all_unreclaimable(zonelist, sc))
|
|
|
return 1;
|