mm: avoid endless looping for oom killed tasks
authorDavid Rientjes <[email protected]>
Wed, 29 Jul 2009 22:02:06 +0000 (15:02 -0700)
committerLinus Torvalds <[email protected]>
Thu, 30 Jul 2009 02:10:34 +0000 (19:10 -0700)
If a task is oom killed and still cannot find memory when trying with
no watermarks, it's better to fail the allocation attempt than to loop
endlessly.  Direct reclaim has already failed and the oom killer will
be a no-op since current has yet to die, so there is no other
alternative for allocations that are not __GFP_NOFAIL.

Acked-by: Mel Gorman <[email protected]>
Signed-off-by: David Rientjes <[email protected]>
Acked-by: Hugh Dickins <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/page_alloc.c

index ae28c22a7fdb66ec85539a9693c72cda8ade221d..2dbb2fc68837e5fa0cf5db4d497370cd37a8d5e9 100644 (file)
@@ -1794,6 +1794,10 @@ rebalance:
        if (p->flags & PF_MEMALLOC)
                goto nopage;
 
+       /* Avoid allocations with no watermarks from looping endlessly */
+       if (test_thread_flag(TIF_MEMDIE) && !(gfp_mask & __GFP_NOFAIL))
+               goto nopage;
+
        /* Try direct reclaim and then allocating */
        page = __alloc_pages_direct_reclaim(gfp_mask, order,
                                        zonelist, high_zoneidx,