patch-2.4.19 linux-2.4.19/mm/oom_kill.c
Next file: linux-2.4.19/mm/page_alloc.c
Previous file: linux-2.4.19/mm/mprotect.c
Back to the patch index
Back to the overall index
- Lines: 77
- Date:
Fri Aug 2 17:39:46 2002
- Orig file:
linux-2.4.18/mm/oom_kill.c
- Orig date:
Sat Nov 3 17:05:25 2001
diff -urN linux-2.4.18/mm/oom_kill.c linux-2.4.19/mm/oom_kill.c
@@ -110,8 +110,7 @@
/*
* Simple selection loop. We chose the process with the highest
- * number of 'points'. We need the locks to make sure that the
- * list of task structs doesn't change while we look the other way.
+ * number of 'points'. We expect the caller will lock the tasklist.
*
* (not docbooked, we don't want this one cluttering up the manual)
*/
@@ -121,7 +120,6 @@
struct task_struct *p = NULL;
struct task_struct *chosen = NULL;
- read_lock(&tasklist_lock);
for_each_task(p) {
if (p->pid) {
int points = badness(p);
@@ -131,7 +129,6 @@
}
}
}
- read_unlock(&tasklist_lock);
return chosen;
}
@@ -170,16 +167,19 @@
*/
static void oom_kill(void)
{
- struct task_struct *p = select_bad_process(), *q;
+ struct task_struct *p, *q;
+
+ read_lock(&tasklist_lock);
+ p = select_bad_process();
/* Found nothing?!?! Either we hang forever, or we panic. */
if (p == NULL)
panic("Out of memory and no killable processes...\n");
/* kill all processes that share the ->mm (i.e. all threads) */
- read_lock(&tasklist_lock);
for_each_task(q) {
- if(q->mm == p->mm) oom_kill_task(q);
+ if (q->mm == p->mm)
+ oom_kill_task(q);
}
read_unlock(&tasklist_lock);
@@ -198,7 +198,7 @@
*/
void out_of_memory(void)
{
- static unsigned long first, last, count;
+ static unsigned long first, last, count, lastkill;
unsigned long now, since;
/*
@@ -235,8 +235,18 @@
return;
/*
+ * If we just killed a process, wait a while
+ * to give that task a chance to exit. This
+ * avoids killing multiple processes needlessly.
+ */
+ since = now - lastkill;
+ if (since < HZ*5)
+ return;
+
+ /*
* Ok, really out of memory. Kill something.
*/
+ lastkill = now;
oom_kill();
reset:
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)