From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755435AbcEaHXx (ORCPT ); Tue, 31 May 2016 03:23:53 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36700 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751462AbcEaHXw (ORCPT ); Tue, 31 May 2016 03:23:52 -0400 From: Michal Hocko To: Andrew Morton Cc: Oleg Nesterov , Tetsuo Handa , David Rientjes , , LKML , Michal Hocko Subject: [PATCH] mm, oom_reaper: do not use siglock in try_oom_reaper Date: Tue, 31 May 2016 09:23:43 +0200 Message-Id: <1464679423-30218-1-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michal Hocko 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") Suggested-by: Oleg Nesterov Signed-off-by: Michal Hocko --- Hi Andrew, Oleg has noticed this while reviewing http://lkml.kernel.org/r/20160530173505.GA25287@redhat.com this should go in 4.7. mm/oom_kill.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index e01cc3e2e755..25eac62c190c 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -625,8 +625,6 @@ void try_oom_reaper(struct task_struct *tsk) if (atomic_read(&mm->mm_users) > 1) { rcu_read_lock(); for_each_process(p) { - bool exiting; - if (!process_shares_mm(p, mm)) continue; if (fatal_signal_pending(p)) @@ -636,10 +634,7 @@ void try_oom_reaper(struct task_struct *tsk) * If the task is exiting make sure the whole thread group * is exiting and cannot acces mm anymore. */ - spin_lock_irq(&p->sighand->siglock); - exiting = signal_group_exit(p->signal); - spin_unlock_irq(&p->sighand->siglock); - if (exiting) + if (signal_group_exit(p->signal)) continue; /* Give up */ -- 2.8.1