|
@@ -283,12 +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 (test_tsk_thread_flag(task, TIF_MEMDIE)) {
|
|
|
- if (!is_sysrq_oom(oc))
|
|
|
- return OOM_SCAN_ABORT;
|
|
|
- }
|
|
|
- if (!task->mm)
|
|
|
- return OOM_SCAN_CONTINUE;
|
|
|
+ if (!is_sysrq_oom(oc) && atomic_read(&task->signal->oom_victims))
|
|
|
+ return OOM_SCAN_ABORT;
|
|
|
|
|
|
/*
|
|
|
* If task is allocating a lot of memory and has been marked to be
|
|
@@ -307,12 +303,12 @@ enum oom_scan_t oom_scan_process_thread(struct oom_control *oc,
|
|
|
static struct task_struct *select_bad_process(struct oom_control *oc,
|
|
|
unsigned int *ppoints, unsigned long totalpages)
|
|
|
{
|
|
|
- struct task_struct *g, *p;
|
|
|
+ struct task_struct *p;
|
|
|
struct task_struct *chosen = NULL;
|
|
|
unsigned long chosen_points = 0;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- for_each_process_thread(g, p) {
|
|
|
+ for_each_process(p) {
|
|
|
unsigned int points;
|
|
|
|
|
|
switch (oom_scan_process_thread(oc, p, totalpages)) {
|
|
@@ -331,9 +327,6 @@ static struct task_struct *select_bad_process(struct oom_control *oc,
|
|
|
points = oom_badness(p, NULL, oc->nodemask, totalpages);
|
|
|
if (!points || points < chosen_points)
|
|
|
continue;
|
|
|
- /* Prefer thread group leaders for display purposes */
|
|
|
- if (points == chosen_points && thread_group_leader(chosen))
|
|
|
- continue;
|
|
|
|
|
|
chosen = p;
|
|
|
chosen_points = points;
|
|
@@ -673,6 +666,7 @@ void mark_oom_victim(struct task_struct *tsk)
|
|
|
/* OOM killer might race with memcg OOM */
|
|
|
if (test_and_set_tsk_thread_flag(tsk, TIF_MEMDIE))
|
|
|
return;
|
|
|
+ atomic_inc(&tsk->signal->oom_victims);
|
|
|
/*
|
|
|
* Make sure that the task is woken up from uninterruptible sleep
|
|
|
* if it is frozen because OOM killer wouldn't be able to free
|
|
@@ -690,6 +684,7 @@ void exit_oom_victim(struct task_struct *tsk)
|
|
|
{
|
|
|
if (!test_and_clear_tsk_thread_flag(tsk, TIF_MEMDIE))
|
|
|
return;
|
|
|
+ atomic_dec(&tsk->signal->oom_victims);
|
|
|
|
|
|
if (!atomic_dec_return(&oom_victims))
|
|
|
wake_up_all(&oom_victims_wait);
|