diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-10-09 18:27:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-09 22:25:56 -0400 |
commit | 6b6482bbf64ef6f6dbc8b52f7a7cf88a0498bd51 (patch) | |
tree | 026e6f1a304c6a9f4da4462427e21fa3178fddfa | |
parent | 8d90274b3b118c9babeefb1302947f33a1364fb5 (diff) |
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>
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>
-rw-r--r-- | include/linux/mempolicy.h | 2 | ||||
-rw-r--r-- | kernel/sched/fair.c | 2 | ||||
-rw-r--r-- | mm/mempolicy.c | 25 |
3 files changed, 13 insertions, 16 deletions
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index f230a978e6ba..5e4bfcedd2ce 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, | |||
136 | 136 | ||
137 | struct mempolicy *get_vma_policy(struct task_struct *tsk, | 137 | struct mempolicy *get_vma_policy(struct task_struct *tsk, |
138 | struct vm_area_struct *vma, unsigned long addr); | 138 | struct vm_area_struct *vma, unsigned long addr); |
139 | bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma); | 139 | bool vma_policy_mof(struct vm_area_struct *vma); |
140 | 140 | ||
141 | extern void numa_default_policy(void); | 141 | extern void numa_default_policy(void); |
142 | extern void numa_policy_init(void); | 142 | extern void numa_policy_init(void); |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index bfa3c86d0d68..82088b29704e 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -1946,7 +1946,7 @@ void task_numa_work(struct callback_head *work) | |||
1946 | vma = mm->mmap; | 1946 | vma = mm->mmap; |
1947 | } | 1947 | } |
1948 | for (; vma; vma = vma->vm_next) { | 1948 | for (; vma; vma = vma->vm_next) { |
1949 | if (!vma_migratable(vma) || !vma_policy_mof(p, vma)) | 1949 | if (!vma_migratable(vma) || !vma_policy_mof(vma)) |
1950 | continue; | 1950 | continue; |
1951 | 1951 | ||
1952 | /* | 1952 | /* |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index b86b08e77b8d..ad27bbc757bf 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -1646,27 +1646,24 @@ struct mempolicy *get_vma_policy(struct task_struct *task, | |||
1646 | return pol; | 1646 | return pol; |
1647 | } | 1647 | } |
1648 | 1648 | ||
1649 | bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma) | 1649 | bool vma_policy_mof(struct vm_area_struct *vma) |
1650 | { | 1650 | { |
1651 | struct mempolicy *pol = NULL; | 1651 | struct mempolicy *pol; |
1652 | |||
1653 | if (vma) { | ||
1654 | if (vma->vm_ops && vma->vm_ops->get_policy) { | ||
1655 | bool ret = false; | ||
1656 | 1652 | ||
1657 | pol = vma->vm_ops->get_policy(vma, vma->vm_start); | 1653 | if (vma->vm_ops && vma->vm_ops->get_policy) { |
1658 | if (pol && (pol->flags & MPOL_F_MOF)) | 1654 | bool ret = false; |
1659 | ret = true; | ||
1660 | mpol_cond_put(pol); | ||
1661 | 1655 | ||
1662 | return ret; | 1656 | pol = vma->vm_ops->get_policy(vma, vma->vm_start); |
1663 | } | 1657 | if (pol && (pol->flags & MPOL_F_MOF)) |
1658 | ret = true; | ||
1659 | mpol_cond_put(pol); | ||
1664 | 1660 | ||
1665 | pol = vma->vm_policy; | 1661 | return ret; |
1666 | } | 1662 | } |
1667 | 1663 | ||
1664 | pol = vma->vm_policy; | ||
1668 | if (!pol) | 1665 | if (!pol) |
1669 | pol = get_task_policy(task); | 1666 | pol = get_task_policy(current); |
1670 | 1667 | ||
1671 | return pol->flags & MPOL_F_MOF; | 1668 | return pol->flags & MPOL_F_MOF; |
1672 | } | 1669 | } |