mempolicy: remove the "task" arg of vma_policy_mof() and simplify it
authorOleg Nesterov <oleg@redhat.com>
Thu, 9 Oct 2014 22:27:48 +0000 (15:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 10 Oct 2014 02:25:56 +0000 (22:25 -0400)
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>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: David Rientjes <rientjes@google.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Hugh Dickins <hughd@google.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/mempolicy.h
kernel/sched/fair.c
mm/mempolicy.c

index f230a978e6baf138e8608f547d49058ae271abe4..5e4bfcedd2ceed5e149709a33a18a64dca6df3d4 100644 (file)
@@ -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);
index bfa3c86d0d6860ccfc53f003b2d5601ae6352e1a..82088b29704ef80ddee61724db4f694a5c7d2ad6 100644 (file)
@@ -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;
 
                /*
index b86b08e77b8d050a380dda5f0769b2742b01f83d..ad27bbc757bf04965bd8e1e777c667f83b385a50 100644 (file)
@@ -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;
 }