On Tue 22-11-16 07:29:36, Michal Hocko wrote: > I would even go one step further and do the following because, honestly, > I never liked GFP_NOFAIL having OOM side effects. > > @@ -3078,32 +3078,31 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > if (page) > goto out; > > - if (!(gfp_mask & __GFP_NOFAIL)) { > - /* Coredumps can quickly deplete all memory reserves */ > - if (current->flags & PF_DUMPCORE) > - goto out; > - /* The OOM killer will not help higher order allocs */ > - if (order > PAGE_ALLOC_COSTLY_ORDER) > - goto out; > - /* The OOM killer does not needlessly kill tasks for lowmem */ > - if (ac->high_zoneidx < ZONE_NORMAL) > - goto out; > - if (pm_suspended_storage()) > - goto out; > - /* > - * XXX: GFP_NOFS allocations should rather fail than rely on > - * other request to make a forward progress. > - * We are in an unfortunate situation where out_of_memory cannot > - * do much for this context but let's try it to at least get > - * access to memory reserved if the current task is killed (see > - * out_of_memory). Once filesystems are ready to handle allocation > - * failures more gracefully we should just bail out here. > - */ > + /* Coredumps can quickly deplete all memory reserves */ > + if (current->flags & PF_DUMPCORE) > + goto out; > + /* The OOM killer will not help higher order allocs */ > + if (order > PAGE_ALLOC_COSTLY_ORDER) > + goto out; > + /* The OOM killer does not needlessly kill tasks for lowmem */ > + if (ac->high_zoneidx < ZONE_NORMAL) > + goto out; > + if (pm_suspended_storage()) > + goto out; > + /* > + * XXX: GFP_NOFS allocations should rather fail than rely on > + * other request to make a forward progress. > + * We are in an unfortunate situation where out_of_memory cannot > + * do much for this context but let's try it to at least get > + * access to memory reserved if the current task is killed (see > + * out_of_memory). Once filesystems are ready to handle allocation > + * failures more gracefully we should just bail out here. > + */ > + > + /* The OOM killer may not free memory on a specific node */ > + if (gfp_mask & __GFP_THISNODE) > + goto out; > > - /* The OOM killer may not free memory on a specific node */ > - if (gfp_mask & __GFP_THISNODE) > - goto out; > - } > /* Exhausted what can be done so it's blamo time */ > if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) { > *did_some_progress = 1; Forgot to include this part of course diff --git a/mm/oom_kill.c b/mm/oom_kill.c index ec9f11d4f094..12a6fce85f61 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -1013,7 +1013,7 @@ bool out_of_memory(struct oom_control *oc) * make sure exclude 0 mask - all other users should have at least * ___GFP_DIRECT_RECLAIM to get here. */ - if (oc->gfp_mask && !(oc->gfp_mask & (__GFP_FS|__GFP_NOFAIL))) + if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS)) return true; /* Anyway I will think about this some more and prepapre patches with the full changelog for further discussion. -- Michal Hocko SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html