Messages in this thread Patch in this message | | | Date | Mon, 11 May 2009 15:46:03 -0700 | From | Andrew Morton <> | Subject | Re: [patch 08/11 -mmotm] oom: invoke oom killer for __GFP_NOFAIL |
| |
On Mon, 11 May 2009 15:31:04 -0700 (PDT) David Rientjes <rientjes@google.com> wrote:
> On Mon, 11 May 2009, Andrew Morton wrote: > > > __GFP_NOFAIL is a bad fiction. Allocations _can_ fail, and callers should > > detect and suitably handle this (and not by lamely moving the infinite > > loop up to the caller level either). > > > > Attempting to use __GFP_NOFAIL for a higher-order allocation is even > > worse, so add a once-off runtime check for this to slap people around for > > even thinking about trying it. > > > > Cc: David Rientjes <rientjes@google.com> > > Cc: Mel Gorman <mel@csn.ul.ie> > > Signed-off-by: Andrew Morton <akpm@linux-foundation.org> > > This only emits a warning when you have CONFIG_DEBUG_KERNEL, > CONFIG_FAULT_INJECTION, and CONFIG_FAIL_PAGE_ALLOC, which is all related > to fault injection (since we never want to inject a fault into anything > using __GFP_NOFAIL). So it may be helpful in tracking down such callers, > but is unrelated to the config options that enable it and it may not get > the best coverage.
oh, well that was pretty useless then. I was trying to find a handy spot where we can avoid adding fastpath cycles.
How about we sneak it into the order>0 leg inside buffered_rmqueue()?
--- a/mm/page_alloc.c~page-allocator-warn-if-__gfp_nofail-is-used-for-a-large-allocation +++ a/mm/page_alloc.c @@ -1130,6 +1130,20 @@ again: list_del(&page->lru); pcp->count--; } else { + if (unlikely(gfp_mask & __GFP_NOFAIL)) { + /* + * __GFP_NOFAIL is not to be used in new code. + * + * All __GFP_NOFAIL callers should be fixed so that they + * properly detect and handle allocation failures. + * + * We most definitely don't want callers attempting to + * allocate greater than single-page units with + * __GFP_NOFAIL. + */ + WARN_ON_ONCE(order > 0); + return 0; + } spin_lock_irqsave(&zone->lock, flags); page = __rmqueue(zone, order, migratetype); __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); _
| |