On 2019/08/05 20:44, Michal Hocko wrote: >> Allowing forced charge due to being unable to invoke memcg OOM killer >> will lead to global OOM situation, and just returning -ENOMEM will not >> solve memcg OOM situation. > > Returning -ENOMEM would effectivelly lead to triggering the oom killer > from the page fault bail out path. So effectively get us back to before > 29ef680ae7c21110. But it is true that this is riskier from the > observability POV when a) the OOM path wouldn't point to the culprit and > b) it would leak ENOMEM from g-u-p path. > Excuse me? But according to my experiment, below code showed flood of "Returning -ENOMEM" message instead of invoking the OOM killer. I didn't find it gets us back to before 29ef680ae7c21110... --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1884,6 +1884,8 @@ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int mem_cgroup_unmark_under_oom(memcg); if (mem_cgroup_out_of_memory(memcg, mask, order)) ret = OOM_SUCCESS; + else if (!(mask & __GFP_FS)) + ret = OOM_SKIPPED; else ret = OOM_FAILED; @@ -2457,8 +2459,10 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, goto nomem; } nomem: - if (!(gfp_mask & __GFP_NOFAIL)) + if (!(gfp_mask & __GFP_NOFAIL)) { + printk("Returning -ENOMEM\n"); return -ENOMEM; + } force: /* * The allocation either can't fail or will lead to more memory --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -1071,7 +1071,7 @@ bool out_of_memory(struct oom_control *oc) * ___GFP_DIRECT_RECLAIM to get here. */ if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS)) - return true; + return !is_memcg_oom(oc); /* * Check if there were limitations on the allocation (only relevant for