lkml.org 
[lkml]   [2014]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4/4] mempolicy: remove the "task" arg of vma_policy_mof() and simplify it
    1. vma_policy_mof(task) is simply not safe unless task == current,
    it can race with do_exit()->mpol_put(). Remove this arg and update
    its single caller.

    2. vma can not be NULL, remove this check and simplify the code.

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    ---
    include/linux/mempolicy.h | 2 +-
    kernel/sched/fair.c | 2 +-
    mm/mempolicy.c | 25 +++++++++++--------------
    3 files changed, 13 insertions(+), 16 deletions(-)

    diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h
    index f230a97..5e4bfce 100644
    --- a/include/linux/mempolicy.h
    +++ b/include/linux/mempolicy.h
    @@ -136,7 +136,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp,

    struct mempolicy *get_vma_policy(struct task_struct *tsk,
    struct vm_area_struct *vma, unsigned long addr);
    -bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma);
    +bool vma_policy_mof(struct vm_area_struct *vma);

    extern void numa_default_policy(void);
    extern void numa_policy_init(void);
    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index bfa3c86..82088b2 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -1946,7 +1946,7 @@ void task_numa_work(struct callback_head *work)
    vma = mm->mmap;
    }
    for (; vma; vma = vma->vm_next) {
    - if (!vma_migratable(vma) || !vma_policy_mof(p, vma))
    + if (!vma_migratable(vma) || !vma_policy_mof(vma))
    continue;

    /*
    diff --git a/mm/mempolicy.c b/mm/mempolicy.c
    index b86b08e..ad27bbc 100644
    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -1646,27 +1646,24 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
    return pol;
    }

    -bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma)
    +bool vma_policy_mof(struct vm_area_struct *vma)
    {
    - struct mempolicy *pol = NULL;
    -
    - if (vma) {
    - if (vma->vm_ops && vma->vm_ops->get_policy) {
    - bool ret = false;
    + struct mempolicy *pol;

    - pol = vma->vm_ops->get_policy(vma, vma->vm_start);
    - if (pol && (pol->flags & MPOL_F_MOF))
    - ret = true;
    - mpol_cond_put(pol);
    + if (vma->vm_ops && vma->vm_ops->get_policy) {
    + bool ret = false;

    - return ret;
    - }
    + pol = vma->vm_ops->get_policy(vma, vma->vm_start);
    + if (pol && (pol->flags & MPOL_F_MOF))
    + ret = true;
    + mpol_cond_put(pol);

    - pol = vma->vm_policy;
    + return ret;
    }

    + pol = vma->vm_policy;
    if (!pol)
    - pol = get_task_policy(task);
    + pol = get_task_policy(current);

    return pol->flags & MPOL_F_MOF;
    }
    --
    1.5.5.1



    \
     
     \ /
      Last update: 2014-08-20 21:41    [W:2.215 / U:0.648 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site