aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mempolicy.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2014-10-09 18:27:45 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-09 22:25:56 -0400
commit8d90274b3b118c9babeefb1302947f33a1364fb5 (patch)
treed500cea8a52cf24049f3f41f4ed24ba2f5d3c71a /mm/mempolicy.c
parentf15ca78e33b0bb5acc0c5d9a5d5be3c55c4f0bb7 (diff)
mempolicy: sanitize the usage of get_task_policy()
Cleanup + preparation. Every user of get_task_policy() calls it unconditionally, even if it is not going to use the result. get_task_policy() is cheap but still this does not look clean, plus the code looks simpler if get_task_policy() is called only when this is really needed. Note: I hope this is correct, but it is not clear why vma_policy_mof() doesn't fall back to get_task_policy() if ->get_policy() returns NULL. 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.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 656db97584f0..b86b08e77b8d 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1621,14 +1621,11 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len,
1621struct mempolicy *get_vma_policy(struct task_struct *task, 1621struct mempolicy *get_vma_policy(struct task_struct *task,
1622 struct vm_area_struct *vma, unsigned long addr) 1622 struct vm_area_struct *vma, unsigned long addr)
1623{ 1623{
1624 struct mempolicy *pol = get_task_policy(task); 1624 struct mempolicy *pol = NULL;
1625 1625
1626 if (vma) { 1626 if (vma) {
1627 if (vma->vm_ops && vma->vm_ops->get_policy) { 1627 if (vma->vm_ops && vma->vm_ops->get_policy) {
1628 struct mempolicy *vpol = vma->vm_ops->get_policy(vma, 1628 pol = vma->vm_ops->get_policy(vma, addr);
1629 addr);
1630 if (vpol)
1631 pol = vpol;
1632 } else if (vma->vm_policy) { 1629 } else if (vma->vm_policy) {
1633 pol = vma->vm_policy; 1630 pol = vma->vm_policy;
1634 1631
@@ -1643,12 +1640,15 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
1643 } 1640 }
1644 } 1641 }
1645 1642
1643 if (!pol)
1644 pol = get_task_policy(task);
1645
1646 return pol; 1646 return pol;
1647} 1647}
1648 1648
1649bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma) 1649bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma)
1650{ 1650{
1651 struct mempolicy *pol = get_task_policy(task); 1651 struct mempolicy *pol = NULL;
1652 1652
1653 if (vma) { 1653 if (vma) {
1654 if (vma->vm_ops && vma->vm_ops->get_policy) { 1654 if (vma->vm_ops && vma->vm_ops->get_policy) {
@@ -1660,11 +1660,14 @@ bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma)
1660 mpol_cond_put(pol); 1660 mpol_cond_put(pol);
1661 1661
1662 return ret; 1662 return ret;
1663 } else if (vma->vm_policy) {
1664 pol = vma->vm_policy;
1665 } 1663 }
1664
1665 pol = vma->vm_policy;
1666 } 1666 }
1667 1667
1668 if (!pol)
1669 pol = get_task_policy(task);
1670
1668 return pol->flags & MPOL_F_MOF; 1671 return pol->flags & MPOL_F_MOF;
1669} 1672}
1670 1673
@@ -2068,12 +2071,12 @@ retry_cpuset:
2068 */ 2071 */
2069struct page *alloc_pages_current(gfp_t gfp, unsigned order) 2072struct page *alloc_pages_current(gfp_t gfp, unsigned order)
2070{ 2073{
2071 struct mempolicy *pol = get_task_policy(current); 2074 struct mempolicy *pol = &default_policy;
2072 struct page *page; 2075 struct page *page;
2073 unsigned int cpuset_mems_cookie; 2076 unsigned int cpuset_mems_cookie;
2074 2077
2075 if (in_interrupt() || (gfp & __GFP_THISNODE)) 2078 if (!in_interrupt() && !(gfp & __GFP_THISNODE))
2076 pol = &default_policy; 2079 pol = get_task_policy(current);
2077 2080
2078retry_cpuset: 2081retry_cpuset:
2079 cpuset_mems_cookie = read_mems_allowed_begin(); 2082 cpuset_mems_cookie = read_mems_allowed_begin();