|
41 | 41 | #include <linux/memcontrol.h>
|
42 | 42 | #include <linux/delayacct.h>
|
43 | 43 | #include <linux/sysctl.h>
|
| 44 | +#include <linux/oom.h> |
44 | 45 |
|
45 | 46 | #include <asm/tlbflush.h>
|
46 | 47 | #include <asm/div64.h>
|
@@ -1988,31 +1989,24 @@ static bool zone_reclaimable(struct zone *zone)
|
1988 | 1989 | return zone->pages_scanned < zone_reclaimable_pages(zone) * 6;
|
1989 | 1990 | }
|
1990 | 1991 |
|
1991 |
| -/* |
1992 |
| - * As hibernation is going on, kswapd is freezed so that it can't mark |
1993 |
| - * the zone into all_unreclaimable. It can't handle OOM during hibernation. |
1994 |
| - * So let's check zone's unreclaimable in direct reclaim as well as kswapd. |
1995 |
| - */ |
| 1992 | +/* All zones in zonelist are unreclaimable? */ |
1996 | 1993 | static bool all_unreclaimable(struct zonelist *zonelist,
|
1997 | 1994 | struct scan_control *sc)
|
1998 | 1995 | {
|
1999 | 1996 | struct zoneref *z;
|
2000 | 1997 | struct zone *zone;
|
2001 |
| - bool all_unreclaimable = true; |
2002 | 1998 |
|
2003 | 1999 | for_each_zone_zonelist_nodemask(zone, z, zonelist,
|
2004 | 2000 | gfp_zone(sc->gfp_mask), sc->nodemask) {
|
2005 | 2001 | if (!populated_zone(zone))
|
2006 | 2002 | continue;
|
2007 | 2003 | if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
|
2008 | 2004 | continue;
|
2009 |
| - if (zone_reclaimable(zone)) { |
2010 |
| - all_unreclaimable = false; |
2011 |
| - break; |
2012 |
| - } |
| 2005 | + if (!zone->all_unreclaimable) |
| 2006 | + return false; |
2013 | 2007 | }
|
2014 | 2008 |
|
2015 |
| - return all_unreclaimable; |
| 2009 | + return true; |
2016 | 2010 | }
|
2017 | 2011 |
|
2018 | 2012 | /*
|
@@ -2108,6 +2102,14 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
|
2108 | 2102 | if (sc->nr_reclaimed)
|
2109 | 2103 | return sc->nr_reclaimed;
|
2110 | 2104 |
|
| 2105 | + /* |
| 2106 | + * As hibernation is going on, kswapd is freezed so that it can't mark |
| 2107 | + * the zone into all_unreclaimable. Thus bypassing all_unreclaimable |
| 2108 | + * check. |
| 2109 | + */ |
| 2110 | + if (oom_killer_disabled) |
| 2111 | + return 0; |
| 2112 | + |
2111 | 2113 | /* top priority shrink_zones still had more to do? don't OOM, then */
|
2112 | 2114 | if (scanning_global_lru(sc) && !all_unreclaimable(zonelist, sc))
|
2113 | 2115 | return 1;
|
|
0 commit comments