lkml.org 
[lkml]   [2010]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [patch] oom: give current access to memory reserves if it has been killed
    On 04/01, David Rientjes wrote:
    >
    > On Wed, 31 Mar 2010, Oleg Nesterov wrote:
    >
    > > Probably something like the patch below makes sense. Note that
    > > "skip kernel threads" logic is wrong too, we should check PF_KTHREAD.
    > > Probably it is better to check it in select_bad_process() instead,
    > > near is_global_init().
    >
    > is_global_init() will be true for p->flags & PF_KTHREAD.

    No, is_global_init() && PF_KTHREAD have nothing to do with each other.

    > > @@ -159,13 +172,9 @@ unsigned int oom_badness(struct task_str
    > > if (p->flags & PF_OOM_ORIGIN)
    > > return 1000;
    > >
    > > - task_lock(p);
    > > - mm = p->mm;
    > > - if (!mm) {
    > > - task_unlock(p);
    > > + p = find_lock_task_mm(p);
    > > + if (!p)
    > > return 0;
    > > - }
    > > -
    > > /*
    > > * The baseline for the badness score is the proportion of RAM that each
    > > * task's rss and swap space use.
    > > @@ -330,12 +339,6 @@ static struct task_struct *select_bad_pr
    > > *ppoints = 1000;
    > > }
    > >
    > > - /*
    > > - * skip kernel threads and tasks which have already released
    > > - * their mm.
    > > - */
    > > - if (!p->mm)
    > > - continue;
    > > if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
    > > continue;
    >
    > You can't do this for the reason I cited in another email, oom_badness()
    > returning 0 does not exclude a task from being chosen by
    > selcet_bad_process(), it will use that task if nothing else has been found
    > yet. We must explicitly filter it from consideration by checking for
    > !p->mm.

    Yes, you are right. OK, oom_badness() can never return points < 0,
    we can make it int and oom_badness() can return -1 if !mm. IOW,

    - unsigned int points;
    + int points;
    ...

    points = oom_badness(...);
    if (points >= 0 && (points > *ppoints || !chosen))
    chosen = p;

    Oleg.



    \
     
     \ /
      Last update: 2010-04-01 18:43    [W:0.035 / U:94.284 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site