lkml.org 
[lkml]   [2010]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [PATCH 3/5] oom: Fix child process iteration properly
    Date
    > On 06/01, KOSAKI Motohiro wrote:
    > >
    > > @@ -88,6 +88,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
    > > {
    > > unsigned long points, cpu_time, run_time;
    > > struct task_struct *c;
    > > + struct task_struct *t = p;
    >
    > This initialization should be moved down to
    >
    > > + do {
    > > + list_for_each_entry(c, &t->children, sibling) {
    > > + child = find_lock_task_mm(c);
    > > + if (child) {
    > > + if (child->mm != p->mm)
    > > + points += child->mm->total_vm/2 + 1;
    > > + task_unlock(child);
    > > + }
    > > }
    > > - }
    > > + } while_each_thread(p, t);
    >
    > this loop. We have "p = find_lock_task_mm(p)" in between which can change p.
    >
    > Apart from this, I think the whole series is nice.

    Nich catch!

    simple incremental patch is here.

    ========================================================
    Subject: [PATCH] Fix oom: Fix child process iteration properly

    p can be changed by find_lock_task_mm()

    Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    ---
    mm/oom_kill.c | 3 ++-
    1 files changed, 2 insertions(+), 1 deletions(-)

    diff --git a/mm/oom_kill.c b/mm/oom_kill.c
    index 9631f1b..9e7f0f9 100644
    --- a/mm/oom_kill.c
    +++ b/mm/oom_kill.c
    @@ -88,7 +88,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
    {
    unsigned long points, cpu_time, run_time;
    struct task_struct *c;
    - struct task_struct *t = p;
    + struct task_struct *t;
    struct task_struct *child;
    int oom_adj = p->signal->oom_adj;
    struct task_cputime task_time;
    @@ -126,6 +126,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
    * child is eating the vast majority of memory, adding only half
    * to the parents will make the child our kill candidate of choice.
    */
    + t = p;
    do {
    list_for_each_entry(c, &t->children, sibling) {
    child = find_lock_task_mm(c);
    --
    1.6.5.2






    \
     
     \ /
      Last update: 2010-06-02 15:57    [W:0.032 / U:92.516 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site