On Thu 24-08-17 21:18:25, Tetsuo Handa wrote: > We are doing last second memory allocation attempt before calling > out_of_memory(). But since slab shrinker functions might indirectly > wait for other thread's __GFP_DIRECT_RECLAIM && !__GFP_NORETRY memory > allocations via sleeping locks, calling slab shrinker functions from > node_reclaim() from get_page_from_freelist() with oom_lock held has > possibility of deadlock. Therefore, make sure that last second memory > allocation attempt does not call slab shrinker functions. OK, I have previously missed that node_reclaim does gfpflags_allow_blocking > Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> > Cc: Michal Hocko <mhocko@xxxxxxxx> > Cc: Mel Gorman <mgorman@xxxxxxx> > Cc: Vlastimil Babka <vbabka@xxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > --- > mm/page_alloc.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 5b983ee..788318f 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3303,10 +3303,13 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...) > /* > * Go through the zonelist yet one more time, keep very high watermark > * here, this is only to catch a parallel oom killing, we must fail if > - * we're still under heavy pressure. > + * we're still under heavy pressure. But make sure that this reclaim > + * attempt shall not depend on __GFP_DIRECT_RECLAIM && !__GFP_NORETRY > + * allocation which will never fail due to oom_lock already held. > */ > - page = get_page_from_freelist(gfp_mask | __GFP_HARDWALL, order, > - ALLOC_WMARK_HIGH|ALLOC_CPUSET, ac); > + page = get_page_from_freelist((gfp_mask | __GFP_HARDWALL) & > + ~__GFP_DIRECT_RECLAIM, order, > + ALLOC_WMARK_HIGH|ALLOC_CPUSET, ac); > if (page) > goto out; > > -- > 1.8.3.1 > -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>