Merge tag 'for-linus-2019-09-27' of git://git.kernel.dk/linux-block
[linux-2.6-block.git] / mm / mempolicy.c
index 65e0874fce1736a65f8ced74f2a94d3e23d718c9..de27d08b1ff8d286ce0eb463041eefc8a746d869 100644 (file)
@@ -68,7 +68,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/mempolicy.h>
-#include <linux/mm.h>
+#include <linux/pagewalk.h>
 #include <linux/highmem.h>
 #include <linux/hugetlb.h>
 #include <linux/kernel.h>
@@ -655,6 +655,12 @@ static int queue_pages_test_walk(unsigned long start, unsigned long end,
        return 1;
 }
 
+static const struct mm_walk_ops queue_pages_walk_ops = {
+       .hugetlb_entry          = queue_pages_hugetlb,
+       .pmd_entry              = queue_pages_pte_range,
+       .test_walk              = queue_pages_test_walk,
+};
+
 /*
  * Walk through page tables and collect pages to be migrated.
  *
@@ -679,15 +685,8 @@ queue_pages_range(struct mm_struct *mm, unsigned long start, unsigned long end,
                .nmask = nodes,
                .prev = NULL,
        };
-       struct mm_walk queue_pages_walk = {
-               .hugetlb_entry = queue_pages_hugetlb,
-               .pmd_entry = queue_pages_pte_range,
-               .test_walk = queue_pages_test_walk,
-               .mm = mm,
-               .private = &qp,
-       };
 
-       return walk_page_range(start, end, &queue_pages_walk);
+       return walk_page_range(mm, start, end, &queue_pages_walk_ops, &qp);
 }
 
 /*
@@ -1406,6 +1405,7 @@ static long kernel_mbind(unsigned long start, unsigned long len,
        int err;
        unsigned short mode_flags;
 
+       start = untagged_addr(start);
        mode_flags = mode & MPOL_MODE_FLAGS;
        mode &= ~MPOL_MODE_FLAGS;
        if (mode >= MPOL_MAX)
@@ -1513,10 +1513,6 @@ static int kernel_migrate_pages(pid_t pid, unsigned long maxnode,
        if (nodes_empty(*new))
                goto out_put;
 
-       nodes_and(*new, *new, node_states[N_MEMORY]);
-       if (nodes_empty(*new))
-               goto out_put;
-
        err = security_task_movememory(task);
        if (err)
                goto out_put;
@@ -1563,6 +1559,8 @@ static int kernel_get_mempolicy(int __user *policy,
        int uninitialized_var(pval);
        nodemask_t nodes;
 
+       addr = untagged_addr(addr);
+
        if (nmask != NULL && maxnode < nr_node_ids)
                return -EINVAL;