diff options
author | Nick Piggin <npiggin@suse.de> | 2006-12-06 20:31:50 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 08:39:20 -0800 |
commit | c33e0fca3508f0aa387b1c10d0ef158102deb140 (patch) | |
tree | d4dbbddbcd7cdf605dc5c0c97088789c7e10f4b4 | |
parent | 7253f4ef04b1cd138baf2b29a95473743ac0a307 (diff) | |
download | lwn-c33e0fca3508f0aa387b1c10d0ef158102deb140.tar.gz lwn-c33e0fca3508f0aa387b1c10d0ef158102deb140.zip |
[PATCH] oom: don't kill unkillable children or siblings
Abort the kill if any of our threads have OOM_DISABLE set. Having this
test here also prevents any OOM_DISABLE child of the "selected" process
from being killed.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | mm/oom_kill.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 2e3ce3a928b9..bc2627deb7f9 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -313,15 +313,24 @@ static int oom_kill_task(struct task_struct *p, const char *message) if (mm == NULL) return 1; + /* + * Don't kill the process if any threads are set to OOM_DISABLE + */ + do_each_thread(g, q) { + if (q->mm == mm && p->oomkilladj == OOM_DISABLE) + return 1; + } while_each_thread(g, q); + __oom_kill_task(p, message); + /* * kill all processes that share the ->mm (i.e. all threads), * but are in a different thread group */ - do_each_thread(g, q) + do_each_thread(g, q) { if (q->mm == mm && q->tgid != p->tgid) __oom_kill_task(q, message); - while_each_thread(g, q); + } while_each_thread(g, q); return 0; } |