Messages in this thread Patch in this message | | | From | Dave Peterson <> | Subject | [PATCH 2/2] mm: fix mm_struct reference counting bugs in mm/oom_kill.c | Date | Thu, 13 Apr 2006 14:52:08 -0700 |
| |
The patch below fixes some mm_struct reference counting bugs in badness().
Signed-Off-By: David S. Peterson <dsp@llnl.gov> ---
Index: linux-2.6.17-rc1-oom/mm/oom_kill.c =================================================================== --- linux-2.6.17-rc1-oom.orig/mm/oom_kill.c 2006-04-13 14:25:16.000000000 -0700 +++ linux-2.6.17-rc1-oom/mm/oom_kill.c 2006-04-13 14:31:47.000000000 -0700 @@ -47,14 +47,17 @@ unsigned long badness(struct task_struct { unsigned long points, cpu_time, run_time, s; struct list_head *tsk; + struct mm_struct *mm, *child_mm; - if (!p->mm) + mm = get_task_mm(p); + + if (mm == NULL) return 0; /* * The memory size of the process is the basis for the badness. */ - points = p->mm->total_vm; + points = mm->total_vm; /* * Processes which fork a lot of child processes are likely @@ -67,10 +70,21 @@ unsigned long badness(struct task_struct list_for_each(tsk, &p->children) { struct task_struct *chld; chld = list_entry(tsk, struct task_struct, sibling); - if (chld->mm != p->mm && chld->mm) - points += chld->mm->total_vm/2 + 1; + + if (chld->mm == mm) + continue; + + child_mm = get_task_mm(chld); + + if (child_mm == NULL) + continue; + + points += child_mm->total_vm/2 + 1; + mmput(child_mm); } + mmput(mm); + /* * CPU time is in tens of seconds and run time is in thousands * of seconds. There is no particular reason for this other than - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |