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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to