mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
oom: thaw the OOM victim if it is frozen
oom_kill_process only sets TIF_MEMDIE flag and sends a signal to the victim. This is basically noop when the task is frozen though because the task sleeps in the uninterruptible sleep. The victim is eventually thawed later when oom_scan_process_thread meets the task again in a later OOM invocation so the OOM killer doesn't live lock. But this is less than optimal. Let's add __thaw_task into mark_tsk_oom_victim after we set TIF_MEMDIE to the victim. We are not checking whether the task is frozen because that would be racy and __thaw_task does that already. oom_scan_process_thread doesn't need to care about freezer anymore as TIF_MEMDIE and freezer are excluded completely now. Signed-off-by: Michal Hocko <mhocko@suse.cz> Cc: Tejun Heo <tj@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Cong Wang <xiyou.wangcong@gmail.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
49550b6055
commit
63a8ca9b20
@ -266,8 +266,6 @@ enum oom_scan_t oom_scan_process_thread(struct task_struct *task,
|
||||
* Don't allow any other task to have access to the reserves.
|
||||
*/
|
||||
if (test_tsk_thread_flag(task, TIF_MEMDIE)) {
|
||||
if (unlikely(frozen(task)))
|
||||
__thaw_task(task);
|
||||
if (!force_kill)
|
||||
return OOM_SCAN_ABORT;
|
||||
}
|
||||
@ -423,6 +421,14 @@ void note_oom_kill(void)
|
||||
void mark_tsk_oom_victim(struct task_struct *tsk)
|
||||
{
|
||||
set_tsk_thread_flag(tsk, TIF_MEMDIE);
|
||||
|
||||
/*
|
||||
* Make sure that the task is woken up from uninterruptible sleep
|
||||
* if it is frozen because OOM killer wouldn't be able to free
|
||||
* any memory and livelock. freezing_slow_path will tell the freezer
|
||||
* that TIF_MEMDIE tasks should be ignored.
|
||||
*/
|
||||
__thaw_task(tsk);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user