From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932911AbbKRJLP (ORCPT ); Wed, 18 Nov 2015 04:11:15 -0500 Received: from mail-wm0-f43.google.com ([74.125.82.43]:33983 "EHLO mail-wm0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932498AbbKRJLD (ORCPT ); Wed, 18 Nov 2015 04:11:03 -0500 Date: Wed, 18 Nov 2015 10:11:01 +0100 From: Michal Hocko To: Tetsuo Handa Cc: Andrew Morton , Mel Gorman , David Rientjes , linux-mm@kvack.org, LKML Subject: Re: [PATCH 2/2] mm: do not loop over ALLOC_NO_WATERMARKS without triggering reclaim Message-ID: <20151118091101.GA19145@dhcp22.suse.cz> References: <1447680139-16484-1-git-send-email-mhocko@kernel.org> <1447680139-16484-3-git-send-email-mhocko@kernel.org> <564B0841.6030409@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <564B0841.6030409@I-love.SAKURA.ne.jp> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue 17-11-15 19:58:09, Tetsuo Handa wrote: > Michal Hocko wrote: > > __alloc_pages_slowpath is looping over ALLOC_NO_WATERMARKS requests if > > __GFP_NOFAIL is requested. This is fragile because we are basically > > relying on somebody else to make the reclaim (be it the direct reclaim > > or OOM killer) for us. The caller might be holding resources (e.g. > > locks) which block other other reclaimers from making any progress for > > example. Remove the retry loop and rely on __alloc_pages_slowpath to > > invoke all allowed reclaim steps and retry logic. > > This implies invoking OOM killer, doesn't it? It does and the changelog is explicit about this. > > /* Avoid recursion of direct reclaim */ > > - if (current->flags & PF_MEMALLOC) > > + if (current->flags & PF_MEMALLOC) { > > + /* > > + * __GFP_NOFAIL request from this context is rather bizarre > > + * because we cannot reclaim anything and only can loop waiting > > + * for somebody to do a work for us. > > + */ > > + if (WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) { > > + cond_resched(); > > + goto retry; > > I think that this "goto retry;" omits call to out_of_memory() which is allowed > for __GFP_NOFAIL allocations. It wasn't called for PF_MEMALLOC requests though. Whether invoking OOM killer is a good idea for this case is a harder question and out of scope of this patch. > Even if this is what you meant, current thread > can be a workqueue, which currently need a short sleep (as with > wait_iff_congested() changes), can't it? As the changelog tries to clarify PF_MEMALLOC with __GFP_NOFAIL is basically a bug. That is the reason I am adding WARN_ON there. I do not think making this code more complex for abusers/buggy code is really worthwhile. Besides that I fail to see why a work item would ever want to set PF_MEMALLOC for legitimate reasons. I have done a quick git grep over the tree and there doesn't seem to be any user. > > > + } > > goto nopage; > > + } > > > > /* Avoid allocations with no watermarks from looping endlessly */ > > if (test_thread_flag(TIF_MEMDIE) && !(gfp_mask & __GFP_NOFAIL)) > > > > Well, is it cond_resched() which should include > > if (current->flags & PF_WQ_WORKER) > schedule_timeout(1); I believe you are getting off-topic here. -- Michal Hocko SUSE Labs