diff options
Diffstat (limited to 'mm/mempolicy.c')
-rw-r--r-- | mm/mempolicy.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 11ff260fb282..368fc9d23610 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -514,6 +514,7 @@ static inline int check_pmd_range(struct vm_area_struct *vma, pud_t *pud, | |||
514 | pmd = pmd_offset(pud, addr); | 514 | pmd = pmd_offset(pud, addr); |
515 | do { | 515 | do { |
516 | next = pmd_addr_end(addr, end); | 516 | next = pmd_addr_end(addr, end); |
517 | split_huge_page_pmd(vma->vm_mm, pmd); | ||
517 | if (pmd_none_or_clear_bad(pmd)) | 518 | if (pmd_none_or_clear_bad(pmd)) |
518 | continue; | 519 | continue; |
519 | if (check_pte_range(vma, pmd, addr, next, nodes, | 520 | if (check_pte_range(vma, pmd, addr, next, nodes, |
@@ -935,7 +936,8 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest, | |||
935 | return PTR_ERR(vma); | 936 | return PTR_ERR(vma); |
936 | 937 | ||
937 | if (!list_empty(&pagelist)) { | 938 | if (!list_empty(&pagelist)) { |
938 | err = migrate_pages(&pagelist, new_node_page, dest, 0); | 939 | err = migrate_pages(&pagelist, new_node_page, dest, |
940 | false, true); | ||
939 | if (err) | 941 | if (err) |
940 | putback_lru_pages(&pagelist); | 942 | putback_lru_pages(&pagelist); |
941 | } | 943 | } |
@@ -1155,7 +1157,8 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
1155 | 1157 | ||
1156 | if (!list_empty(&pagelist)) { | 1158 | if (!list_empty(&pagelist)) { |
1157 | nr_failed = migrate_pages(&pagelist, new_vma_page, | 1159 | nr_failed = migrate_pages(&pagelist, new_vma_page, |
1158 | (unsigned long)vma, 0); | 1160 | (unsigned long)vma, |
1161 | false, true); | ||
1159 | if (nr_failed) | 1162 | if (nr_failed) |
1160 | putback_lru_pages(&pagelist); | 1163 | putback_lru_pages(&pagelist); |
1161 | } | 1164 | } |
@@ -1308,16 +1311,13 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, | |||
1308 | 1311 | ||
1309 | /* Find the mm_struct */ | 1312 | /* Find the mm_struct */ |
1310 | rcu_read_lock(); | 1313 | rcu_read_lock(); |
1311 | read_lock(&tasklist_lock); | ||
1312 | task = pid ? find_task_by_vpid(pid) : current; | 1314 | task = pid ? find_task_by_vpid(pid) : current; |
1313 | if (!task) { | 1315 | if (!task) { |
1314 | read_unlock(&tasklist_lock); | ||
1315 | rcu_read_unlock(); | 1316 | rcu_read_unlock(); |
1316 | err = -ESRCH; | 1317 | err = -ESRCH; |
1317 | goto out; | 1318 | goto out; |
1318 | } | 1319 | } |
1319 | mm = get_task_mm(task); | 1320 | mm = get_task_mm(task); |
1320 | read_unlock(&tasklist_lock); | ||
1321 | rcu_read_unlock(); | 1321 | rcu_read_unlock(); |
1322 | 1322 | ||
1323 | err = -EINVAL; | 1323 | err = -EINVAL; |
@@ -1796,7 +1796,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, | |||
1796 | } | 1796 | } |
1797 | 1797 | ||
1798 | /** | 1798 | /** |
1799 | * alloc_page_vma - Allocate a page for a VMA. | 1799 | * alloc_pages_vma - Allocate a page for a VMA. |
1800 | * | 1800 | * |
1801 | * @gfp: | 1801 | * @gfp: |
1802 | * %GFP_USER user allocation. | 1802 | * %GFP_USER user allocation. |
@@ -1805,6 +1805,7 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, | |||
1805 | * %GFP_FS allocation should not call back into a file system. | 1805 | * %GFP_FS allocation should not call back into a file system. |
1806 | * %GFP_ATOMIC don't sleep. | 1806 | * %GFP_ATOMIC don't sleep. |
1807 | * | 1807 | * |
1808 | * @order:Order of the GFP allocation. | ||
1808 | * @vma: Pointer to VMA or NULL if not available. | 1809 | * @vma: Pointer to VMA or NULL if not available. |
1809 | * @addr: Virtual Address of the allocation. Must be inside the VMA. | 1810 | * @addr: Virtual Address of the allocation. Must be inside the VMA. |
1810 | * | 1811 | * |
@@ -1818,7 +1819,8 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, | |||
1818 | * Should be called with the mm_sem of the vma hold. | 1819 | * Should be called with the mm_sem of the vma hold. |
1819 | */ | 1820 | */ |
1820 | struct page * | 1821 | struct page * |
1821 | alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) | 1822 | alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, |
1823 | unsigned long addr) | ||
1822 | { | 1824 | { |
1823 | struct mempolicy *pol = get_vma_policy(current, vma, addr); | 1825 | struct mempolicy *pol = get_vma_policy(current, vma, addr); |
1824 | struct zonelist *zl; | 1826 | struct zonelist *zl; |
@@ -1830,7 +1832,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) | |||
1830 | 1832 | ||
1831 | nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); | 1833 | nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); |
1832 | mpol_cond_put(pol); | 1834 | mpol_cond_put(pol); |
1833 | page = alloc_page_interleave(gfp, 0, nid); | 1835 | page = alloc_page_interleave(gfp, order, nid); |
1834 | put_mems_allowed(); | 1836 | put_mems_allowed(); |
1835 | return page; | 1837 | return page; |
1836 | } | 1838 | } |
@@ -1839,7 +1841,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) | |||
1839 | /* | 1841 | /* |
1840 | * slow path: ref counted shared policy | 1842 | * slow path: ref counted shared policy |
1841 | */ | 1843 | */ |
1842 | struct page *page = __alloc_pages_nodemask(gfp, 0, | 1844 | struct page *page = __alloc_pages_nodemask(gfp, order, |
1843 | zl, policy_nodemask(gfp, pol)); | 1845 | zl, policy_nodemask(gfp, pol)); |
1844 | __mpol_put(pol); | 1846 | __mpol_put(pol); |
1845 | put_mems_allowed(); | 1847 | put_mems_allowed(); |
@@ -1848,7 +1850,8 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) | |||
1848 | /* | 1850 | /* |
1849 | * fast path: default or task policy | 1851 | * fast path: default or task policy |
1850 | */ | 1852 | */ |
1851 | page = __alloc_pages_nodemask(gfp, 0, zl, policy_nodemask(gfp, pol)); | 1853 | page = __alloc_pages_nodemask(gfp, order, zl, |
1854 | policy_nodemask(gfp, pol)); | ||
1852 | put_mems_allowed(); | 1855 | put_mems_allowed(); |
1853 | return page; | 1856 | return page; |
1854 | } | 1857 | } |