mm,oom_reaper: do not attempt to reap a task twice
"mm, oom_reaper: do not attempt to reap a task twice" tried to give the OOM reaper one more chance to retry using MMF_OOM_NOT_REAPABLE flag. But the usefulness of the flag is rather limited and actually never shown in practice. If the flag is set, it means that the holder of mm->mmap_sem cannot call up_write() due to presumably being blocked at unkillable wait waiting for other thread's memory allocation. But since one of threads sharing that mm will queue that mm immediately via task_will_free_mem() shortcut (otherwise, oom_badness() will select the same mm again due to oom_score_adj value unchanged), retrying MMF_OOM_NOT_REAPABLE mm is unlikely helpful. Let's always set MMF_OOM_REAPED. Link: http://lkml.kernel.org/r/1472119394-11342-3-git-send-email-mhocko@kernel.org Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Michal Hocko <mhocko@suse.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: David Rientjes <rientjes@google.com> Cc: Vladimir Davydov <vdavydov@parallels.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7ebffa4555
commit
8496afaba9
|
@ -525,7 +525,6 @@ static inline int get_dumpable(struct mm_struct *mm)
|
||||||
#define MMF_HAS_UPROBES 19 /* has uprobes */
|
#define MMF_HAS_UPROBES 19 /* has uprobes */
|
||||||
#define MMF_RECALC_UPROBES 20 /* MMF_HAS_UPROBES can be wrong */
|
#define MMF_RECALC_UPROBES 20 /* MMF_HAS_UPROBES can be wrong */
|
||||||
#define MMF_OOM_REAPED 21 /* mm has been already reaped */
|
#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)
|
#define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK)
|
||||||
|
|
||||||
|
|
|
@ -578,20 +578,11 @@ static void oom_reap_task(struct task_struct *tsk)
|
||||||
if (attempts <= MAX_OOM_REAP_RETRIES)
|
if (attempts <= MAX_OOM_REAP_RETRIES)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
/* Ignore this mm because somebody can't call up_write(mmap_sem). */
|
||||||
|
set_bit(MMF_OOM_REAPED, &mm->flags);
|
||||||
|
|
||||||
pr_info("oom_reaper: unable to reap pid:%d (%s)\n",
|
pr_info("oom_reaper: unable to reap pid:%d (%s)\n",
|
||||||
task_pid_nr(tsk), tsk->comm);
|
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.
|
|
||||||
*/
|
|
||||||
if (test_and_set_bit(MMF_OOM_NOT_REAPABLE, &mm->flags)) {
|
|
||||||
pr_info("oom_reaper: giving up pid:%d (%s)\n",
|
|
||||||
task_pid_nr(tsk), tsk->comm);
|
|
||||||
set_bit(MMF_OOM_REAPED, &mm->flags);
|
|
||||||
}
|
|
||||||
debug_show_all_locks();
|
debug_show_all_locks();
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
Loading…
Reference in New Issue