Hello,
This oom_kill fix is to do mmput(mm) a bit earlier and returning 0 or 1
to indicate success or failure instead of returning mm_struct pointer.
Coywolf
Signed-off-by: Coywolf Qi Hunt <[email protected]>
oom_kill.c | 23 +++++++++--------------
1 files changed, 9 insertions(+), 14 deletions(-)
diff -Nrup 2.6.11/mm/oom_kill.c 2.6.11-cy/mm/oom_kill.c
--- 2.6.11/mm/oom_kill.c 2005-03-03 17:12:18.000000000 +0800
+++ 2.6.11-cy/mm/oom_kill.c 2005-03-15 00:28:32.000000000 +0800
@@ -202,16 +202,16 @@ static void __oom_kill_task(task_t *p)
force_sig(SIGKILL, p);
}
-static struct mm_struct *oom_kill_task(task_t *p)
+static int oom_kill_task(task_t *p)
{
struct mm_struct *mm = get_task_mm(p);
task_t * g, * q;
if (!mm)
- return NULL;
+ return 0;
if (mm == &init_mm) {
mmput(mm);
- return NULL;
+ return 0;
}
__oom_kill_task(p);
@@ -224,12 +224,12 @@ static struct mm_struct *oom_kill_task(t
__oom_kill_task(q);
while_each_thread(g, q);
- return mm;
+ mmput(mm);
+ return 1;
}
-static struct mm_struct *oom_kill_process(struct task_struct *p)
+static int oom_kill_process(struct task_struct *p)
{
- struct mm_struct *mm;
struct task_struct *c;
struct list_head *tsk;
@@ -238,9 +238,8 @@ static struct mm_struct *oom_kill_proces
c = list_entry(tsk, struct task_struct, sibling);
if (c->mm == p->mm)
continue;
- mm = oom_kill_task(c);
- if (mm)
- return mm;
+ if (oom_kill_task(c))
+ return 1;
}
return oom_kill_task(p);
}
@@ -255,7 +254,6 @@ static struct mm_struct *oom_kill_proces
*/
void out_of_memory(int gfp_mask)
{
- struct mm_struct *mm = NULL;
task_t * p;
read_lock(&tasklist_lock);
@@ -274,14 +272,11 @@ retry:
printk("oom-killer: gfp_mask=0x%x\n", gfp_mask);
show_free_areas();
- mm = oom_kill_process(p);
- if (!mm)
+ if (!oom_kill_process(p))
goto retry;
out:
read_unlock(&tasklist_lock);
- if (mm)
- mmput(mm);
/*
* Give "p" a good chance of killing itself before we
Coywolf Qi Hunt <[email protected]> wrote:
>
> This oom_kill fix is to do mmput(mm) a bit earlier and returning 0 or 1
> to indicate success or failure instead of returning mm_struct pointer.
Why is this a "fix"? What bug is it fixing?
On Mon, 14 Mar 2005 18:02:58 -0800, Andrew Morton <[email protected]> wrote:
> Coywolf Qi Hunt <[email protected]> wrote:
> >
> > This oom_kill fix is to do mmput(mm) a bit earlier and returning 0 or 1
> > to indicate success or failure instead of returning mm_struct pointer.
>
> Why is this a "fix"? What bug is it fixing?
>
It's at least a coding style improvement and lets the code be less obfuscated.
It increases the system survival possibilities by doing mmput immediately
and reduces the chances of oom killing another process unnecessarily, IMHO.
Or rather rename "fix" to "cleanup".
--
Coywolf Qi Hunt
http://sosdg.org/~coywolf/