On Tuesday, October 21, 2014 09:27:12 AM Michal Hocko wrote: > From: Cong Wang <xiyou.wangcong@xxxxxxxxx> > > Since f660daac474c6f (oom: thaw threads if oom killed thread is frozen > before deferring) OOM killer relies on being able to thaw a frozen task > to handle OOM situation but a3201227f803 (freezer: make freezing() test > freeze conditions in effect instead of TIF_FREEZE) has reorganized the > code and stopped clearing freeze flag in __thaw_task. This means that > the target task only wakes up and goes into the fridge again because the > freezing condition hasn't changed for it. This reintroduces the bug > fixed by f660daac474c6f. > > Fix the issue by checking for TIF_MEMDIE thread flag in > freezing_slow_path and exclude the task from freezing completely. If a > task was already frozen it would get woken by __thaw_task from OOM killer > and get out of freezer after rechecking freezing(). > > Changes since v1 > - put TIF_MEMDIE check into freezing_slowpath rather than in __refrigerator > as per Oleg > - return __thaw_task into oom_scan_process_thread because > oom_kill_process will not wake task in the fridge because it is > sleeping uninterruptible > > [mhocko@xxxxxxx: rewrote the changelog] > Fixes: a3201227f803 (freezer: make freezing() test freeze conditions in effect instead of TIF_FREEZE) > Cc: stable@xxxxxxxxxxxxxxx # 3.3+ > Cc: David Rientjes <rientjes@xxxxxxxxxx> > Cc: Michal Hocko <mhocko@xxxxxxx> > Cc: "Rafael J. Wysocki" <rjw@xxxxxxxxxxxxx> > Cc: Tejun Heo <tj@xxxxxxxxxx> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Cong Wang <xiyou.wangcong@xxxxxxxxx> > Signed-off-by: Michal Hocko <mhocko@xxxxxxx> > Acked-by: Oleg Nesterov <oleg@xxxxxxxxxx> ACK > --- > kernel/freezer.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/kernel/freezer.c b/kernel/freezer.c > index aa6a8aadb911..8f9279b9c6d7 100644 > --- a/kernel/freezer.c > +++ b/kernel/freezer.c > @@ -42,6 +42,9 @@ bool freezing_slow_path(struct task_struct *p) > if (p->flags & (PF_NOFREEZE | PF_SUSPEND_TASK)) > return false; > > + if (test_thread_flag(TIF_MEMDIE)) > + return false; > + > if (pm_nosig_freezing || cgroup_freezing(p)) > return true; > > -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center. -- 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>