oom: oom_kill_process: fix the child_points logic

oom_kill_process() starts with victim_points == 0. This means that
(most likely) any child has more points and can be killed erroneously.

Also, "children has a different mm" doesn't match the reality, we should
check child->mm != t->mm. This check is not exactly correct if t->mm ==
NULL but this doesn't really matter, oom_kill_task() will kill them
anyway.

Note: "Kill all processes sharing p->mm" in oom_kill_task() is wrong
too.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Oleg Nesterov and committed by Linus Torvalds dc1b83ab 5f40d420

Changed files
+8 -3
mm
+8 -3
mm/oom_kill.c
··· 458 458 struct mem_cgroup *mem, nodemask_t *nodemask, 459 459 const char *message) 460 460 { 461 - struct task_struct *victim = p; 461 + struct task_struct *victim; 462 462 struct task_struct *child; 463 - struct task_struct *t = p; 464 - unsigned int victim_points = 0; 463 + struct task_struct *t; 464 + unsigned int victim_points; 465 465 466 466 if (printk_ratelimit()) 467 467 dump_header(p, gfp_mask, order, mem, nodemask); ··· 487 487 * parent. This attempts to lose the minimal amount of work done while 488 488 * still freeing memory. 489 489 */ 490 + victim_points = oom_badness(p, mem, nodemask, totalpages); 491 + victim = p; 492 + t = p; 490 493 do { 491 494 list_for_each_entry(child, &t->children, sibling) { 492 495 unsigned int child_points; 493 496 497 + if (child->mm == t->mm) 498 + continue; 494 499 /* 495 500 * oom_badness() returns 0 if the thread is unkillable 496 501 */