From: Vlastimil Babka <vbabka@suse.cz>
To: Michal Hocko <mhocko@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Mel Gorman <mgorman@suse.de>,
David Rientjes <rientjes@google.com>,
linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] mm, oom: Give __GFP_NOFAIL allocations access to memory reserves
Date: Mon, 23 Nov 2015 10:43:42 +0100 [thread overview]
Message-ID: <5652DFCE.3010201@suse.cz> (raw)
In-Reply-To: <20151123092925.GB21050@dhcp22.suse.cz>
On 11/23/2015 10:29 AM, Michal Hocko wrote:
> On Sun 22-11-15 13:55:31, Vlastimil Babka wrote:
>> On 11.11.2015 14:48, mhocko@kernel.org wrote:
>>> mm/page_alloc.c | 10 +++++++++-
>>> 1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>>> index 8034909faad2..d30bce9d7ac8 100644
>>> --- a/mm/page_alloc.c
>>> +++ b/mm/page_alloc.c
>>> @@ -2766,8 +2766,16 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
>>> goto out;
>>> }
>>> /* Exhausted what can be done so it's blamo time */
>>> - if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL))
>>> + if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) {
>>> *did_some_progress = 1;
>>> +
>>> + if (gfp_mask & __GFP_NOFAIL) {
>>> + page = get_page_from_freelist(gfp_mask, order,
>>> + ALLOC_NO_WATERMARKS|ALLOC_CPUSET, ac);
>>> + WARN_ONCE(!page, "Unable to fullfil gfp_nofail allocation."
>>> + " Consider increasing min_free_kbytes.\n");
>>
>> It seems redundant to me to keep the WARN_ON_ONCE also above in the if () part?
>
> They are warning about two different things. The first one catches a
> buggy code which uses __GFP_NOFAIL from oom disabled context while the
Ah, I see, I misinterpreted what the return values of out_of_memory()
mean. But now that I look at its code, it seems to only return false
when oom_killer_disabled is set to true. Which is a global thing and
nothing to do with the context of the __GFP_NOFAIL allocation?
> second one tries to help the administrator with a hint that memory
> reserves are too small.
>
>> Also s/gfp_nofail/GFP_NOFAIL/ for consistency?
>
> Fair enough, changed.
>
>> Hm and probably out of scope of your patch, but I understand the WARN_ONCE
>> (WARN_ON_ONCE) to be _ONCE just to prevent a flood from a single task looping
>> here. But for distinct tasks and potentially far away in time, wouldn't we want
>> to see all the warnings? Would that be feasible to implement?
>
> I was thinking about that as well some time ago but it was quite
> hard to find a good enough API to tell when to warn again. The first
> WARN_ON_ONCE should trigger for all different _code paths_ no matter
> how frequently they appear to catch all the buggy callers. The second
> one would benefit from a new warning after min_free_kbytes was updated
> because it would tell the administrator that the last update was not
> sufficient for the workload.
Hm, what about adding a flag to the struct alloc_context, so that when
the particular allocation attempt emits the warning, it sets a flag in
the alloc_context so that it won't emit them again as long as it keeps
looping and attempting oom. Other allocations will warn independently.
We could also print the same info as the "allocation failed" warnings
do, since it's very similar, except we can't fail - but the admin/bug
reporter should be interested in the same details as for an allocation
failure that is allowed to fail. But it's also true that we have
probably just printed the info during out_of_memory()... except when we
skipped that for some reason?
>>
>>> + }
>>> + }
>>> out:
>>> mutex_unlock(&oom_lock);
>>> return page;
>>>
>
> Thanks!
>
next prev parent reply other threads:[~2015-11-23 9:43 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-11 13:48 [PATCH] mm, oom: Give __GFP_NOFAIL allocations access to memory reserves mhocko
2015-11-11 15:54 ` Johannes Weiner
2015-11-12 8:51 ` Michal Hocko
2015-11-22 12:55 ` Vlastimil Babka
2015-11-23 9:29 ` Michal Hocko
2015-11-23 9:43 ` Vlastimil Babka [this message]
2015-11-23 10:13 ` Michal Hocko
2015-11-23 21:26 ` David Rientjes
2015-11-24 9:47 ` Michal Hocko
2015-11-24 16:26 ` Johannes Weiner
2015-11-24 17:02 ` Michal Hocko
2015-11-24 19:57 ` Johannes Weiner
2015-11-25 9:33 ` Michal Hocko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5652DFCE.3010201@suse.cz \
--to=vbabka@suse.cz \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=mhocko@kernel.org \
--cc=rientjes@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox