lkml.org 
[lkml]   [2012]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 74/84] revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages"
    Date
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: KOSAKI Motohiro <kosaki.motohiro@gmail.com>

    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>

    ---
    mm/mempolicy.c | 41 ++++++++++++++++++++++++-----------------
    1 file changed, 24 insertions(+), 17 deletions(-)

    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -606,6 +606,27 @@ check_range(struct mm_struct *mm, unsign
    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)
    @@ -645,23 +666,9 @@ static int mbind_range(struct mm_struct
    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:



    \
     
     \ /
      Last update: 2012-10-11 05:21    [W:4.104 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site