struct zoneref *z;
        struct zone *zone;
        unsigned long writeback_threshold;
+       bool should_abort_reclaim;
 
        get_mems_allowed();
        delayacct_freepages_start();
                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;
 
                /*
        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;