There has been two problems about SysRq-f (manual invocation of the OOM killer). One is that moom_callback() is not called by moom_work under OOM livelock situation because it does not have a dedicated WQ like vmstat_wq. The other is that select_bad_process() selects a thread group which already has a TIF_MEMDIE thread because oom_scan_process_thread() was scanning all threads of all thread groups and find_lock_task_mm() can return a TIF_MEMDIE thread. Since commit f44666b04605d1c7 ("mm,oom: speed up select_bad_process() loop") changed oom_scan_process_group() to use task->signal->oom_victims, the OOM killer will no longer select a thread group which already has a TIF_MEMDIE thread. But SysRq-f will select such thread group due to returning OOM_SCAN_OK. Although we will change oom_badness() to return 0 after the OOM reaper gave up reaping the OOM victim's mm, currently there is possibility that the OOM reaper is not called (due to "the OOM victim's mm is shared by unkillable threads" or "the OOM reaper thread is not available due to kthread_run() failure or CONFIG_MMU=n"). Therefore, we need to make sure that SysRq-f will skip oom_badness() if such thread group has a TIF_MEMDIE thread. Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Cc: David Rientjes <rientjes@xxxxxxxxxx> --- mm/oom_kill.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 1685890..c16331c 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -283,8 +283,8 @@ enum oom_scan_t oom_scan_process_thread(struct oom_control *oc, * This task already has access to memory reserves and is being killed. * Don't allow any other task to have access to the reserves. */ - if (!is_sysrq_oom(oc) && atomic_read(&task->signal->oom_victims)) - return OOM_SCAN_ABORT; + if (atomic_read(&task->signal->oom_victims)) + return !is_sysrq_oom(oc) ? OOM_SCAN_ABORT : OOM_SCAN_CONTINUE; /* * If task is allocating a lot of memory and has been marked to be -- 1.8.3.1 -- 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>