From: Michal Hocko <mhocko@kernel.org> To: <linux-mm@kvack.org> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>, David Rientjes <rientjes@google.com>, Oleg Nesterov <oleg@redhat.com>, Vladimir Davydov <vdavydov@parallels.com>, Andrew Morton <akpm@linux-foundation.org>, LKML <linux-kernel@vger.kernel.org>, Michal Hocko <mhocko@suse.com> Subject: [PATCH 09/10] mm, oom_reaper: do not attempt to reap a task more than twice Date: Thu, 9 Jun 2016 13:52:16 +0200 [thread overview] Message-ID: <1465473137-22531-10-git-send-email-mhocko@kernel.org> (raw) In-Reply-To: <1465473137-22531-1-git-send-email-mhocko@kernel.org> From: Michal Hocko <mhocko@suse.com> oom_reaper relies on the mmap_sem for read to do its job. Many places which might block readers have been converted to use down_write_killable and that has reduced chances of the contention a lot. Some paths where the mmap_sem is held for write can take other locks and they might either be not prepared to fail due to fatal signal pending or too impractical to be changed. This patch introduces MMF_OOM_NOT_REAPABLE flag which gets set after the first attempt to reap a task's mm fails. If the flag is present after the failure then we set MMF_OOM_REAPED to hide this mm from the oom killer completely so it can go and chose another victim. As a result a risk of OOM deadlock when the oom victim would be blocked indefinetly and so the oom killer cannot make any progress should be mitigated considerably while we still try really hard to perform all reclaim attempts and stay predictable in the behavior. Signed-off-by: Michal Hocko <mhocko@suse.com> --- include/linux/sched.h | 1 + mm/oom_kill.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index 7442f74b6d44..6d81a1eb974a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -512,6 +512,7 @@ static inline int get_dumpable(struct mm_struct *mm) #define MMF_HAS_UPROBES 19 /* has uprobes */ #define MMF_RECALC_UPROBES 20 /* MMF_HAS_UPROBES can be wrong */ #define MMF_OOM_REAPED 21 /* mm has been already reaped */ +#define MMF_OOM_NOT_REAPABLE 22 /* mm couldn't be reaped */ #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index b250aecae4f9..3e35d2a487cf 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -556,8 +556,27 @@ static void oom_reap_task(struct task_struct *tsk) schedule_timeout_idle(HZ/10); if (attempts > MAX_OOM_REAP_RETRIES) { + struct task_struct *p; + pr_info("oom_reaper: unable to reap pid:%d (%s)\n", task_pid_nr(tsk), tsk->comm); + + /* + * If we've already tried to reap this task in the past and + * failed it probably doesn't make much sense to try yet again + * so hide the mm from the oom killer so that it can move on + * to another task with a different mm struct. + */ + p = find_lock_task_mm(tsk); + if (p) { + if (test_and_set_bit(MMF_OOM_NOT_REAPABLE, &p->mm->flags)) { + pr_info("oom_reaper: giving up pid:%d (%s)\n", + task_pid_nr(tsk), tsk->comm); + set_bit(MMF_OOM_REAPED, &p->mm->flags); + } + task_unlock(p); + } + debug_show_all_locks(); } -- 2.8.1
WARNING: multiple messages have this Message-ID (diff)
From: Michal Hocko <mhocko@kernel.org> To: linux-mm@kvack.org Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>, David Rientjes <rientjes@google.com>, Oleg Nesterov <oleg@redhat.com>, Vladimir Davydov <vdavydov@parallels.com>, Andrew Morton <akpm@linux-foundation.org>, LKML <linux-kernel@vger.kernel.org>, Michal Hocko <mhocko@suse.com> Subject: [PATCH 09/10] mm, oom_reaper: do not attempt to reap a task more than twice Date: Thu, 9 Jun 2016 13:52:16 +0200 [thread overview] Message-ID: <1465473137-22531-10-git-send-email-mhocko@kernel.org> (raw) In-Reply-To: <1465473137-22531-1-git-send-email-mhocko@kernel.org> From: Michal Hocko <mhocko@suse.com> oom_reaper relies on the mmap_sem for read to do its job. Many places which might block readers have been converted to use down_write_killable and that has reduced chances of the contention a lot. Some paths where the mmap_sem is held for write can take other locks and they might either be not prepared to fail due to fatal signal pending or too impractical to be changed. This patch introduces MMF_OOM_NOT_REAPABLE flag which gets set after the first attempt to reap a task's mm fails. If the flag is present after the failure then we set MMF_OOM_REAPED to hide this mm from the oom killer completely so it can go and chose another victim. As a result a risk of OOM deadlock when the oom victim would be blocked indefinetly and so the oom killer cannot make any progress should be mitigated considerably while we still try really hard to perform all reclaim attempts and stay predictable in the behavior. Signed-off-by: Michal Hocko <mhocko@suse.com> --- include/linux/sched.h | 1 + mm/oom_kill.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index 7442f74b6d44..6d81a1eb974a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -512,6 +512,7 @@ static inline int get_dumpable(struct mm_struct *mm) #define MMF_HAS_UPROBES 19 /* has uprobes */ #define MMF_RECALC_UPROBES 20 /* MMF_HAS_UPROBES can be wrong */ #define MMF_OOM_REAPED 21 /* mm has been already reaped */ +#define MMF_OOM_NOT_REAPABLE 22 /* mm couldn't be reaped */ #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index b250aecae4f9..3e35d2a487cf 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -556,8 +556,27 @@ static void oom_reap_task(struct task_struct *tsk) schedule_timeout_idle(HZ/10); if (attempts > MAX_OOM_REAP_RETRIES) { + struct task_struct *p; + pr_info("oom_reaper: unable to reap pid:%d (%s)\n", task_pid_nr(tsk), tsk->comm); + + /* + * If we've already tried to reap this task in the past and + * failed it probably doesn't make much sense to try yet again + * so hide the mm from the oom killer so that it can move on + * to another task with a different mm struct. + */ + p = find_lock_task_mm(tsk); + if (p) { + if (test_and_set_bit(MMF_OOM_NOT_REAPABLE, &p->mm->flags)) { + pr_info("oom_reaper: giving up pid:%d (%s)\n", + task_pid_nr(tsk), tsk->comm); + set_bit(MMF_OOM_REAPED, &p->mm->flags); + } + task_unlock(p); + } + debug_show_all_locks(); } -- 2.8.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-06-09 11:52 UTC|newest] Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-06-09 11:52 [PATCH 0/10 -v4] Handle oom bypass more gracefully Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 01/10] proc, oom: drop bogus task_lock and mm check Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 02/10] proc, oom: drop bogus sighand lock Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 03/10] proc, oom_adj: extract oom_score_adj setting into a helper Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 04/10] mm, oom_adj: make sure processes sharing mm have same view of oom_score_adj Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-15 15:03 ` Oleg Nesterov 2016-06-15 15:03 ` Oleg Nesterov 2016-06-09 11:52 ` [PATCH 05/10] mm, oom: skip vforked tasks from being selected Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-15 14:51 ` Oleg Nesterov 2016-06-15 14:51 ` Oleg Nesterov 2016-06-16 6:24 ` Michal Hocko 2016-06-16 6:24 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 06/10] mm, oom: kill all tasks sharing the mm Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 07/10] mm, oom: fortify task_will_free_mem Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 13:18 ` Tetsuo Handa 2016-06-09 13:18 ` Tetsuo Handa 2016-06-09 14:20 ` Michal Hocko 2016-06-09 14:20 ` Michal Hocko 2016-06-11 8:10 ` Tetsuo Handa 2016-06-11 8:10 ` Tetsuo Handa 2016-06-13 11:27 ` Michal Hocko 2016-06-13 11:27 ` Michal Hocko 2016-06-16 12:54 ` Tetsuo Handa 2016-06-16 12:54 ` Tetsuo Handa 2016-06-16 14:29 ` Michal Hocko 2016-06-16 14:29 ` Michal Hocko 2016-06-16 15:40 ` Tetsuo Handa 2016-06-16 15:40 ` Tetsuo Handa 2016-06-16 15:53 ` Michal Hocko 2016-06-16 15:53 ` Michal Hocko 2016-06-17 11:38 ` Tetsuo Handa 2016-06-17 11:38 ` Tetsuo Handa 2016-06-17 12:26 ` Michal Hocko 2016-06-17 12:26 ` Michal Hocko 2016-06-17 13:12 ` Tetsuo Handa 2016-06-17 13:12 ` Tetsuo Handa 2016-06-17 13:29 ` Michal Hocko 2016-06-17 13:29 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 08/10] mm, oom: task_will_free_mem should skip oom_reaped tasks Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-17 11:35 ` Tetsuo Handa 2016-06-17 11:35 ` Tetsuo Handa 2016-06-17 12:56 ` Michal Hocko 2016-06-17 12:56 ` Michal Hocko 2016-06-09 11:52 ` Michal Hocko [this message] 2016-06-09 11:52 ` [PATCH 09/10] mm, oom_reaper: do not attempt to reap a task more than twice Michal Hocko 2016-06-15 14:48 ` Oleg Nesterov 2016-06-15 14:48 ` Oleg Nesterov 2016-06-16 6:28 ` Michal Hocko 2016-06-16 6:28 ` Michal Hocko 2016-06-09 11:52 ` [PATCH 10/10] mm, oom: hide mm which is shared with kthread or global init Michal Hocko 2016-06-09 11:52 ` Michal Hocko 2016-06-09 15:15 ` Tetsuo Handa 2016-06-09 15:15 ` Tetsuo Handa 2016-06-09 15:41 ` Michal Hocko 2016-06-09 15:41 ` Michal Hocko 2016-06-16 13:15 ` Tetsuo Handa 2016-06-16 13:15 ` Tetsuo Handa 2016-06-16 13:36 ` Tetsuo Handa 2016-06-16 13:36 ` Tetsuo Handa 2016-06-15 14:37 ` Oleg Nesterov 2016-06-15 14:37 ` Oleg Nesterov 2016-06-16 6:31 ` Michal Hocko 2016-06-16 6:31 ` Michal Hocko 2016-06-13 11:23 ` [PATCH 0/10 -v4] Handle oom bypass more gracefully Michal Hocko 2016-06-13 11:23 ` Michal Hocko 2016-06-13 14:13 ` Michal Hocko 2016-06-13 14:13 ` Michal Hocko 2016-06-14 20:17 ` Oleg Nesterov 2016-06-14 20:17 ` Oleg Nesterov 2016-06-14 20:44 ` Oleg Nesterov 2016-06-14 20:44 ` Oleg Nesterov 2016-06-16 6:33 ` Michal Hocko 2016-06-16 6:33 ` Michal Hocko 2016-06-15 15:09 ` Oleg Nesterov 2016-06-15 15:09 ` Oleg Nesterov 2016-06-16 6:34 ` Michal Hocko 2016-06-16 6:34 ` Michal Hocko 2016-06-20 12:43 [PATCH 0/10 -v5] " Michal Hocko 2016-06-20 12:43 ` [PATCH 09/10] mm, oom_reaper: do not attempt to reap a task more than twice Michal Hocko 2016-06-20 12:43 ` 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=1465473137-22531-10-git-send-email-mhocko@kernel.org \ --to=mhocko@kernel.org \ --cc=akpm@linux-foundation.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mhocko@suse.com \ --cc=oleg@redhat.com \ --cc=penguin-kernel@I-love.SAKURA.ne.jp \ --cc=rientjes@google.com \ --cc=vdavydov@parallels.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.