diff options
author | Michal Hocko <mhocko@suse.com> | 2016-06-03 17:55:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-03 19:02:56 -0400 |
commit | cbdcf7f78900625de35173961b9b95cde22bce45 (patch) | |
tree | 313e8398a476f95583156893e8459c3f3592201a /mm | |
parent | 83b9355bf6f449c7d1231206c300ea89d3313a9d (diff) |
mm, oom_reaper: do not use siglock in try_oom_reaper()
Oleg has noted that siglock usage in try_oom_reaper is both pointless
and dangerous. signal_group_exit can be checked lockless. The problem
is that sighand becomes NULL in __exit_signal so we can crash.
Fixes: 3ef22dfff239 ("oom, oom_reaper: try to reap tasks which skip regular OOM killer path")
Link: http://lkml.kernel.org/r/1464679423-30218-1-git-send-email-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/oom_kill.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index dfb1ab61fb23..acbc432d1a52 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -625,8 +625,6 @@ void try_oom_reaper(struct task_struct *tsk) | |||
625 | if (atomic_read(&mm->mm_users) > 1) { | 625 | if (atomic_read(&mm->mm_users) > 1) { |
626 | rcu_read_lock(); | 626 | rcu_read_lock(); |
627 | for_each_process(p) { | 627 | for_each_process(p) { |
628 | bool exiting; | ||
629 | |||
630 | if (!process_shares_mm(p, mm)) | 628 | if (!process_shares_mm(p, mm)) |
631 | continue; | 629 | continue; |
632 | if (fatal_signal_pending(p)) | 630 | if (fatal_signal_pending(p)) |
@@ -636,10 +634,7 @@ void try_oom_reaper(struct task_struct *tsk) | |||
636 | * If the task is exiting make sure the whole thread group | 634 | * If the task is exiting make sure the whole thread group |
637 | * is exiting and cannot acces mm anymore. | 635 | * is exiting and cannot acces mm anymore. |
638 | */ | 636 | */ |
639 | spin_lock_irq(&p->sighand->siglock); | 637 | if (signal_group_exit(p->signal)) |
640 | exiting = signal_group_exit(p->signal); | ||
641 | spin_unlock_irq(&p->sighand->siglock); | ||
642 | if (exiting) | ||
643 | continue; | 638 | continue; |
644 | 639 | ||
645 | /* Give up */ | 640 | /* Give up */ |