Messages in this thread |  | | Date | Fri, 17 Jul 2009 10:21:57 +0100 | From | Mel Gorman <> | Subject | Re: [PATCH] page-allocator: Ensure that processes that have been OOM killed exit the page allocator (resend) |
| |
On Thu, Jul 16, 2009 at 12:14:13PM -0700, David Rientjes wrote: > On Thu, 16 Jul 2009, Mel Gorman wrote: > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index 4b8552e..b381a6b 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -1830,8 +1830,6 @@ rebalance: > > if (order > PAGE_ALLOC_COSTLY_ORDER && > > !(gfp_mask & __GFP_NOFAIL)) > > goto nopage; > > - > > - goto restart; > > } > > } > > > > > > This isn't right (and not only because it'll add a compiler warning > because `restart' is now unused). > > This would immediately fail any allocation that triggered the oom killer > and ended up being selected that isn't __GFP_NOFAIL, even if it would have > succeeded without even killing any task simply because it allocates > without watermarks. > > It will also, coupled with your earlier patch, inappropriately warn about > an infinite loop with __GFP_NOFAIL even though it hasn't even attempted to > loop once since that decision is now handled by should_alloc_retry(). > > The liklihood of such an infinite loop, considering only one thread per > system (or cpuset) can be TIF_MEMDIE at a time, is very low. I've never > seen memory reserves completely depleted such that the next high-priority > allocation wouldn't succeed so that current could handle its pending > SIGKILL. > > You get the same behavior with my patch, but are allowed to try the high > priority allocation again for the attempt that triggered the oom killer > (and not only subsequent ones).
Ok, lets go with this patch then. Thanks
> --- > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1789,6 +1789,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, >
-- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab
|  |