* [patch] oom: don't kill current when another OOM in progress
@ 2006-09-07 10:34 Nick Piggin
0 siblings, 0 replies; only message in thread
From: Nick Piggin @ 2006-09-07 10:34 UTC (permalink / raw)
To: Andrew Morton; +Cc: Linux Memory Management List
A previous patch to allow an exiting task to OOM kill itself (and thereby
avoid a little deadlock) introduced a problem. We don't want the PF_EXITING
task, even if it is 'current', to access mem reserves if there is already a
TIF_MEMDIE process in the system sucking up reserves.
Also make the commenting a little bit clearer, and note that our current
scheme of effectively single threading the OOM killer is not itself perfect.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Index: linux-2.6/mm/oom_kill.c
===================================================================
--- linux-2.6.orig/mm/oom_kill.c
+++ linux-2.6/mm/oom_kill.c
@@ -217,6 +217,18 @@ static struct task_struct *select_bad_pr
continue;
/*
+ * This task already has access to memory reserves and is
+ * being killed. Don't allow any other task access to the
+ * memory reserve.
+ *
+ * Note: this may have a chance of deadlock if it gets
+ * blocked waiting for another task which itself is waiting
+ * for memory. Is there a better alternative?
+ */
+ if (test_tsk_thread_flag(p, TIF_MEMDIE))
+ return ERR_PTR(-1UL);
+
+ /*
* This is in the process of releasing memory so wait for it
* to finish before killing some other task by mistake.
*
@@ -224,16 +236,15 @@ static struct task_struct *select_bad_pr
* go ahead if it is exiting: this will simply set TIF_MEMDIE,
* which will allow it to gain access to memory reserves in
* the process of exiting and releasing its resources.
- * Otherwise we could get an OOM deadlock.
+ * Otherwise we could get an easy OOM deadlock.
*/
- if ((p->flags & PF_EXITING) && p == current) {
+ if (p->flags & PF_EXITING) {
+ if (p != current)
+ return ERR_PTR(-1UL);
+
chosen = p;
*ppoints = ULONG_MAX;
- break;
}
- if ((p->flags & PF_EXITING) ||
- test_tsk_thread_flag(p, TIF_MEMDIE))
- return ERR_PTR(-1UL);
if (p->oomkilladj == OOM_DISABLE)
continue;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-09-07 10:34 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-07 10:34 [patch] oom: don't kill current when another OOM in progress Nick Piggin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox