Skip to content

Commit

Permalink
oom: don't try to kill oom_unkillable child
Browse files Browse the repository at this point in the history
Presently, badness() doesn't care about either CPUSET nor mempolicy.  Then
if the victim child process have disjoint nodemask, OOM Killer might kill
innocent process.

This patch fixes it.

[[email protected]: coding-style fixes]
Signed-off-by: KOSAKI Motohiro <[email protected]>
Reviewed-by: Minchan Kim <[email protected]>
Cc: Minchan Kim <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: KAMEZAWA Hiroyuki <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
kosaki authored and torvalds committed Aug 10, 2010
1 parent 1489fa1 commit 7c59aec
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions mm/oom_kill.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ static int oom_kill_task(struct task_struct *p)

static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
unsigned long points, struct mem_cgroup *mem,
const char *message)
nodemask_t *nodemask, const char *message)
{
struct task_struct *victim = p;
struct task_struct *child;
Expand Down Expand Up @@ -469,6 +469,8 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
continue;
if (mem && !task_in_mem_cgroup(child, mem))
continue;
if (!has_intersects_mems_allowed(child, nodemask))
continue;

/* badness() returns 0 if the thread is unkillable */
child_points = badness(child, uptime.tv_sec);
Expand Down Expand Up @@ -519,7 +521,7 @@ void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask)
if (!p || PTR_ERR(p) == -1UL)
goto out;

if (oom_kill_process(p, gfp_mask, 0, points, mem,
if (oom_kill_process(p, gfp_mask, 0, points, mem, NULL,
"Memory cgroup out of memory"))
goto retry;
out:
Expand Down Expand Up @@ -679,6 +681,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
* the tasklist scan.
*/
if (!oom_kill_process(current, gfp_mask, order, 0, NULL,
nodemask,
"Out of memory (oom_kill_allocating_task)"))
return;
}
Expand All @@ -697,7 +700,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
panic("Out of memory and no killable processes...\n");
}

if (oom_kill_process(p, gfp_mask, order, points, NULL,
if (oom_kill_process(p, gfp_mask, order, points, NULL, nodemask,
"Out of memory"))
goto retry;
read_unlock(&tasklist_lock);
Expand Down

0 comments on commit 7c59aec

Please sign in to comment.