mm: vmscan: check if reclaim should really abort even if compaction_ready() is true...
[firefly-linux-kernel-4.4.55.git] / mm / mempolicy.c
index a85171de5d06fc133b26375860a35368768d867f..dd5f8747e6ff030462041edf49832b6a8fdbb82b 100644 (file)
@@ -606,27 +606,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
        return first;
 }
 
-/* Apply policy to a single VMA */
-static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new)
-{
-       int err = 0;
-       struct mempolicy *old = vma->vm_policy;
-
-       pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
-                vma->vm_start, vma->vm_end, vma->vm_pgoff,
-                vma->vm_ops, vma->vm_file,
-                vma->vm_ops ? vma->vm_ops->set_policy : NULL);
-
-       if (vma->vm_ops && vma->vm_ops->set_policy)
-               err = vma->vm_ops->set_policy(vma, new);
-       if (!err) {
-               mpol_get(new);
-               vma->vm_policy = new;
-               mpol_put(old);
-       }
-       return err;
-}
-
 /* Step 2: apply policy to a range and do splits. */
 static int mbind_range(struct mm_struct *mm, unsigned long start,
                       unsigned long end, struct mempolicy *new_pol)
@@ -666,9 +645,23 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
                        if (err)
                                goto out;
                }
-               err = policy_vma(vma, new_pol);
-               if (err)
-                       goto out;
+
+               /*
+                * Apply policy to a single VMA. The reference counting of
+                * policy for vma_policy linkages has already been handled by
+                * vma_merge and split_vma as necessary. If this is a shared
+                * policy then ->set_policy will increment the reference count
+                * for an sp node.
+                */
+               pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
+                       vma->vm_start, vma->vm_end, vma->vm_pgoff,
+                       vma->vm_ops, vma->vm_file,
+                       vma->vm_ops ? vma->vm_ops->set_policy : NULL);
+               if (vma->vm_ops && vma->vm_ops->set_policy) {
+                       err = vma->vm_ops->set_policy(vma, new_pol);
+                       if (err)
+                               goto out;
+               }
        }
 
  out:
@@ -933,7 +926,7 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest,
 
        if (!list_empty(&pagelist)) {
                err = migrate_pages(&pagelist, new_node_page, dest,
-                                                               false, true);
+                                                       false, MIGRATE_SYNC);
                if (err)
                        putback_lru_pages(&pagelist);
        }