]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages"
authorGuangyu Sun <guangyu.sun@oracle.com>
Fri, 6 Jul 2012 15:19:53 +0000 (08:19 -0700)
committerGuangyu Sun <guangyu.sun@oracle.com>
Fri, 6 Jul 2012 15:19:53 +0000 (08:19 -0700)
This reverts commit 05f144a0d5c2207a0349348127f996e104ad7404.

This patch is broken and should have been reverted by now by an
alternative fix.

Signed-off-by: Guangyu Sun <guangyu.sun@oracle.com>
mm/mempolicy.c

index f26fd421a70120436347ceaaea42b4e618bcfa7e..12b60f391ff6b3f1f57584b444cf9acc4ac25b0d 100644 (file)
@@ -606,6 +606,27 @@ 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)
@@ -653,23 +674,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
                        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;
-               }
+               err = policy_vma(vma, new_pol);
+               if (err)
+                       goto out;
        }
 
  out: