--- 2.2.14-oom/include/linux/sched.h.~1~ Tue Jan 4 19:12:25 2000 +++ 2.2.14-oom/include/linux/sched.h Fri Jan 28 18:51:18 2000 @@ -328,6 +328,9 @@ /* Thread group tracking */ u32 parent_exec_id; u32 self_exec_id; + +/* oom handling */ + int oom_kill_try; }; /* @@ -395,6 +398,7 @@ /* mm */ &init_mm, \ /* signals */ SPIN_LOCK_UNLOCKED, &init_signals, {{0}}, {{0}}, NULL, &init_task.sigqueue, 0, 0, \ /* exec cts */ 0,0, \ +/* oom */ 0, \ } union task_union { --- 2.2.14-oom/arch/i386/mm/fault.c.~1~ Tue Jan 4 19:12:11 2000 +++ 2.2.14-oom/arch/i386/mm/fault.c Sat Jan 29 16:23:08 2000 @@ -291,7 +291,8 @@ up(&mm->mmap_sem); if (error_code & 4) { - if (!((regs->eflags >> 12) & 3)) + if (tsk->oom_kill_try++ > 10 || + !((regs->eflags >> 12) & 3)) { printk("VM: killing process %s\n", tsk->comm); do_exit(SIGKILL); @@ -304,6 +305,11 @@ */ printk("VM: terminating process %s\n", tsk->comm); force_sig(SIGTERM, current); + if (tsk->oom_kill_try > 1) + { + tsk->policy |= SCHED_YIELD; + schedule(); + } return; } }