Messages in this thread Patch in this message | | | Date | Sat, 9 May 2009 15:46:39 -0700 (PDT) | From | David Rientjes <> | Subject | [patch -mmotm] mm: invoke oom killer for __GFP_NOFAIL |
| |
The oom killer must be invoked regardless of the order if the allocation is __GFP_NOFAIL, otherwise it will loop forever when reclaim fails to free some memory.
Cc: Mel Gorman <mel@csn.ul.ie> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Nick Piggin <npiggin@suse.de> Cc: Christoph Lameter <cl@linux-foundation.org> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Signed-off-by: David Rientjes <rientjes@google.com> --- mm/page_alloc.c | 16 ++++++---------- 1 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1547,7 +1547,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, goto out; /* The OOM killer will not help higher order allocs */ - if (order > PAGE_ALLOC_COSTLY_ORDER) + if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL)) goto out; /* Exhausted what can be done so it's blamo time */ @@ -1763,16 +1763,12 @@ rebalance: migratetype); if (page) goto got_pg; + if ((gfp_mask & __GFP_NOFAIL) || + order <= PAGE_ALLOC_COSTLY_ORDER) + goto restart; - /* - * The OOM killer does not trigger for high-order allocations - * but if no progress is being made, there are no other - * options and retrying is unlikely to help - */ - if (order > PAGE_ALLOC_COSTLY_ORDER) - goto nopage; - - goto restart; + /* No freeing is possible so just fail */ + goto nopage; } }
| |