Messages in this thread Patch in this message | | | From | KOSAKI Motohiro <> | Subject | [PATCH 3/4] oom: oom_kill doesn't kill vfork parent(or child) | Date | Tue, 4 Aug 2009 19:27:21 +0900 (JST) |
| |
Subject: [PATCH] oom: oom_kill doesn't kill vfork parent(or child).
Current oom_kill doesn't only kill victim process, but also kill mm shread task. it mean vfork parent will be killed.
but, That's bogus. another process have another oom_adj. we shouldn't ignore their oom_adj (it might have OOM_DISABLE).
following caller hit the minefield.
--------------------------------------- switch (constraint) { case CONSTRAINT_MEMORY_POLICY: oom_kill_process(current, gfp_mask, order, 0, NULL, "No available memory (MPOL_BIND)"); break;
Note: force_sig(SIGKILL) send SIGKILL to all thread in the process. We don't need to care multi thread in here.
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Paul Menage <menage@google.com> Cc: David Rientjes <rientjes@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Rik van Riel <riel@redhat.com>, Cc: Andrew Morton <akpm@linux-foundation.org>, --- mm/oom_kill.c | 12 ------------ 1 file changed, 12 deletions(-)
Index: b/mm/oom_kill.c =================================================================== --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -399,23 +399,11 @@ static void __oom_kill_task(struct task_ static int oom_kill_task(struct task_struct *p) { - struct task_struct *g, *q; - if (get_oom_adj(p) == OOM_DISABLE) return 1; __oom_kill_task(p, 1); - /* - * kill all processes that share the ->mm (i.e. all threads), - * but are in a different thread group. Don't let them have access - * to memory reserves though, otherwise we might deplete all memory. - */ - do_each_thread(g, q) { - if (q->mm == p->mm && !same_thread_group(q, p)) - force_sig(SIGKILL, q); - } while_each_thread(g, q); - return 0; }
| |