From: Guangyu Sun Date: Fri, 6 Jul 2012 15:19:53 +0000 (-0700) Subject: Revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages" X-Git-Tag: v2.6.39-400.9.0~500 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c9aaa184842cb9ab19b5a9dd63a345bb2e487be8;p=users%2Fjedix%2Flinux-maple.git Revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages" This reverts commit 05f144a0d5c2207a0349348127f996e104ad7404. This patch is broken and should have been reverted by now by an alternative fix. Signed-off-by: Guangyu Sun --- diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f26fd421a701..12b60f391ff6 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -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: