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 /mm/mempolicy.c | |
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>
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 25 |
1 files changed, 11 insertions, 14 deletions
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 | } |