forked from Minki/linux
mm, oom: prefer thread group leaders for display purposes
When two threads have the same badness score, it's preferable to kill the thread group leader so that the actual process name is printed to the kernel log rather than the thread group name which may be shared amongst several processes. This was the behavior when select_bad_process() used to do for_each_process(), but it now iterates threads instead and leads to ambiguity. Signed-off-by: David Rientjes <rientjes@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.cz> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Greg Thelen <gthelen@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
c3ac14b267
commit
d49ad93554
@ -1841,13 +1841,18 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
|
||||
break;
|
||||
};
|
||||
points = oom_badness(task, memcg, NULL, totalpages);
|
||||
if (points > chosen_points) {
|
||||
if (chosen)
|
||||
put_task_struct(chosen);
|
||||
chosen = task;
|
||||
chosen_points = points;
|
||||
get_task_struct(chosen);
|
||||
}
|
||||
if (!points || points < chosen_points)
|
||||
continue;
|
||||
/* Prefer thread group leaders for display purposes */
|
||||
if (points == chosen_points &&
|
||||
thread_group_leader(chosen))
|
||||
continue;
|
||||
|
||||
if (chosen)
|
||||
put_task_struct(chosen);
|
||||
chosen = task;
|
||||
chosen_points = points;
|
||||
get_task_struct(chosen);
|
||||
}
|
||||
css_task_iter_end(&it);
|
||||
}
|
||||
|
@ -327,10 +327,14 @@ static struct task_struct *select_bad_process(unsigned int *ppoints,
|
||||
break;
|
||||
};
|
||||
points = oom_badness(p, NULL, nodemask, totalpages);
|
||||
if (points > chosen_points) {
|
||||
chosen = p;
|
||||
chosen_points = points;
|
||||
}
|
||||
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;
|
||||
}
|
||||
if (chosen)
|
||||
get_task_struct(chosen);
|
||||
|
Loading…
Reference in New Issue
Block a user