lkml.org 
[lkml]   [2010]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/9] oom: make oom_unkillable_task() helper function
    Date

    Now, we have the same task check in three places. Unify it.

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

    diff --git a/mm/oom_kill.c b/mm/oom_kill.c
    index 3e48023..12204c7 100644
    --- a/mm/oom_kill.c
    +++ b/mm/oom_kill.c
    @@ -276,6 +276,26 @@ static enum oom_constraint constrained_alloc(struct zonelist *zonelist,
    }
    #endif

    +/* return true if the task is not adequate as candidate victim task. */
    +static bool oom_unkillable_task(struct task_struct *p, struct mem_cgroup *mem,
    + const nodemask_t *nodemask)
    +{
    + if (is_global_init(p))
    + return true;
    + if (p->flags & PF_KTHREAD)
    + return true;
    +
    + /* When mem_cgroup_out_of_memory() and p is not member of the group */
    + if (mem && !task_in_mem_cgroup(p, mem))
    + return true;
    +
    + /* p may not have freeable memory in nodemask */
    + if (!has_intersects_mems_allowed(p, nodemask))
    + return true;
    +
    + return false;
    +}
    +
    /*
    * Simple selection loop. We chose the process with the highest
    * number of 'points'. We expect the caller will lock the tasklist.
    @@ -294,12 +314,7 @@ static struct task_struct *select_bad_process(unsigned long *ppoints,
    for_each_process(p) {
    unsigned long points;

    - /* skip the init task and kthreads */
    - if (is_global_init(p) || (p->flags & PF_KTHREAD))
    - continue;
    - if (mem && !task_in_mem_cgroup(p, mem))
    - continue;
    - if (!has_intersects_mems_allowed(p, nodemask))
    + if (oom_unkillable_task(p, mem, nodemask))
    continue;

    /*
    @@ -440,11 +455,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
    * When oom_kill_allocating_task is enabled, p can be
    * unkillable. check it first.
    */
    - if (is_global_init(p) || (p->flags & PF_KTHREAD))
    - return 1;
    - if (mem && !task_in_mem_cgroup(p, mem))
    - return 1;
    - if (!has_intersects_mems_allowed(p, nodemask))
    + if (oom_unkillable_task(p, mem, nodemask))
    return 1;

    if (printk_ratelimit())
    @@ -477,11 +488,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,

    if (child->mm == p->mm)
    continue;
    - if (child->flags & PF_KTHREAD)
    - continue;
    - if (mem && !task_in_mem_cgroup(child, mem))
    - continue;
    - if (!has_intersects_mems_allowed(child, nodemask))
    + if (oom_unkillable_task(child, mem, nodemask))
    continue;

    /* oom_badness() returns 0 if the thread is unkillable */
    --
    1.6.5.2




    \
     
     \ /
      Last update: 2010-06-16 13:35    [W:0.024 / U:90.812 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site