On Thu 12-12-13 11:31:59, Michal Hocko wrote: [...] > > > Anyway. > > > Does the reclaim make any sense for PF_EXITING tasks? Shouldn't we > > > simply bypass charges of these tasks automatically. Those tasks will > > > free some memory anyway so why to trigger reclaim and potentially OOM > > > in the first place? Do we need to go via TIF_MEMDIE loop in the first > > > place? > > > > > > > I don't see any reason to make an optimization there since they will get > > TIF_MEMDIE set if reclaim has failed on one of their charges or if it > > results in a system oom through the page allocator's oom killer. > > This all will happen after MEM_CGROUP_RECLAIM_RETRIES full reclaim > rounds. Is it really worth the addional overhead just to later say "OK > go ahead and skipp charges"? > And for the !oom memcg it might reclaim some pages which could have > stayed on LRUs just to free some memory little bit later and release the > memory pressure. > So I would rather go with > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index c72b03bf9679..fee25c5934d2 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2692,7 +2693,8 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, > * MEMDIE process. > */ > if (unlikely(test_thread_flag(TIF_MEMDIE) > - || fatal_signal_pending(current))) > + || fatal_signal_pending(current)) > + || current->flags & PF_EXITING) > goto bypass; > > if (unlikely(task_in_memcg_oom(current))) > > rather than the later checks down the oom_synchronize paths. The comment > already mentions dying process... With the full changelog. I will repost it in a separate thread if you are OK with this. --- >From 6e24846f531bb1cc2e68383abf9a6c63b4ee1f78 Mon Sep 17 00:00:00 2001 From: Michal Hocko <mhocko@xxxxxxx> Date: Thu, 12 Dec 2013 11:37:27 +0100 Subject: [PATCH] memcg: Do not hang on OOM when killed by userspace OOM Eric has reported that he can see task(s) stuck in memcg OOM handler regularly. The only way out is to echo 0 > $GROUP/memory.oom_controll His usecase is: - Setup a hierarchy with memory and the freezer (disable kernel oom and have a process watch for oom). - In that memory cgroup add a process with one thread per cpu. - In one thread slowly allocate once per second I think it is 16M of ram and mlock and dirty it (just to force the pages into ram and stay there). - When oom is achieved loop: * attempt to freeze all of the tasks. * if frozen send every task SIGKILL, unfreeze, remove the directory in cgroupfs. Eric has then pinpointed the issue to be memcg specific. All tasks are sitting on the memcg_oom_waitq when memcg oom is disabled. Those that have received fatal signal will bypass the charge and should continue on their way out. The tricky part is that the exit path might trigger a page fault (e.g. exit_robust_list) thus the memcg charge while its memcg is still under OOM because nobody has released any charges. Unlike with the in-kernel OOM handler the exiting task doesn't get TIF_MEMDIE set so it doesn't shortcut charges and falls to the memcg OOM again without any way out of it as there are no fatal signals pending anymore. This patch fixes the issue by checking PF_EXITING early in __mem_cgroup_try_charge and bypass the charge same as if it had fatal signal pending or TIF_MEMDIE set. Normally (not killed) exiting tasks will bypass the charge now but this should be OK as the task is leaving and will release memory and increasing the memory pressure just to release it in a moment seems dubious wasting of cycles. Besides that charges after exit_signals should be rare. Signed-off-by: Michal Hocko <mhocko@xxxxxxx> --- mm/memcontrol.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c72b03bf9679..98900c070045 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2692,7 +2692,8 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, * MEMDIE process. */ if (unlikely(test_thread_flag(TIF_MEMDIE) - || fatal_signal_pending(current))) + || fatal_signal_pending(current)) + || current->flags & PF_EXITING) goto bypass; if (unlikely(task_in_memcg_oom(current))) -- 1.8.4.4 -- 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>