revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages"
commit 8d34694c1abf29df1f3c7317936b7e3e2e308d9b upstream. Commit 05f144a0d5c2 ("mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages") removed vma->vm_policy updates code but it is the purpose of mbind_range(). Now, mbind_range() is virtually a no-op and while it does not allow memory corruption it is not the right fix. This patch is a revert. [mgorman@suse.de: Edited changelog] Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Mel Gorman <mgorman@suse.de> Cc: Christoph Lameter <cl@linux.com> Cc: Josh Boyer <jwboyer@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
160f00fefe
commit
14cfd9f986
|
@ -607,6 +607,27 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
|
||||||
return first;
|
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. */
|
/* Step 2: apply policy to a range and do splits. */
|
||||||
static int mbind_range(struct mm_struct *mm, unsigned long start,
|
static int mbind_range(struct mm_struct *mm, unsigned long start,
|
||||||
unsigned long end, struct mempolicy *new_pol)
|
unsigned long end, struct mempolicy *new_pol)
|
||||||
|
@ -655,23 +676,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
err = policy_vma(vma, new_pol);
|
||||||
/*
|
if (err)
|
||||||
* Apply policy to a single VMA. The reference counting of
|
goto out;
|
||||||
* 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:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue