]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/mempolicy.c
mm, mempolicy: clean up __GFP_THISNODE confusion in policy_zonelist
[karo-tx-linux.git] / mm / mempolicy.c
index 0b859af06b87df4e17af4180b953a6337c251dff..4d58021dba344fb3519786adb172ddca5b40b11d 100644 (file)
@@ -496,7 +496,7 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
                        page = pmd_page(*pmd);
                        if (is_huge_zero_page(page)) {
                                spin_unlock(ptl);
-                               split_huge_pmd(vma, pmd, addr);
+                               __split_huge_pmd(vma, pmd, addr, false, NULL);
                        } else {
                                get_page(page);
                                spin_unlock(ptl);
@@ -1679,25 +1679,17 @@ static nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy)
 static struct zonelist *policy_zonelist(gfp_t gfp, struct mempolicy *policy,
        int nd)
 {
-       switch (policy->mode) {
-       case MPOL_PREFERRED:
-               if (!(policy->flags & MPOL_F_LOCAL))
-                       nd = policy->v.preferred_node;
-               break;
-       case MPOL_BIND:
+       if (policy->mode == MPOL_PREFERRED && !(policy->flags & MPOL_F_LOCAL))
+               nd = policy->v.preferred_node;
+       else {
                /*
-                * Normally, MPOL_BIND allocations are node-local within the
-                * allowed nodemask.  However, if __GFP_THISNODE is set and the
-                * current node isn't part of the mask, we use the zonelist for
-                * the first node in the mask instead.
+                * __GFP_THISNODE shouldn't even be used with the bind policy
+                * because we might easily break the expectation to stay on the
+                * requested node and not break the policy.
                 */
-               if (unlikely(gfp & __GFP_THISNODE) &&
-                               unlikely(!node_isset(nd, policy->v.nodes)))
-                       nd = first_node(policy->v.nodes);
-               break;
-       default:
-               BUG();
+               WARN_ON_ONCE(policy->mode == MPOL_BIND && (gfp & __GFP_THISNODE));
        }
+
        return node_zonelist(nd, gfp);
 }