diff --git a/[refs] b/[refs] index ebfbc1e0b2d7..0a039baad39b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d37dd5dcb955dd8c2cdd4eaef1f15d1b7ecbc379 +refs/heads/master: 3cf23841b4b76eb94d3f8d0fb3627690e4431413 diff --git a/trunk/mm/vmscan.c b/trunk/mm/vmscan.c index e73d0206dddd..828530e2794a 100644 --- a/trunk/mm/vmscan.c +++ b/trunk/mm/vmscan.c @@ -1202,6 +1202,14 @@ static int too_many_isolated(struct zone *zone, int file, isolated = zone_page_state(zone, NR_ISOLATED_ANON); } + /* + * GFP_NOIO/GFP_NOFS callers are allowed to isolate more pages, so they + * won't get blocked by normal direct-reclaimers, forming a circular + * deadlock. + */ + if ((sc->gfp_mask & GFP_IOFS) == GFP_IOFS) + inactive >>= 3; + return isolated > inactive; }