lkml.org 
[lkml]   [2011]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[124/272] mm: fix hugepage migration
    2.6.37-stable review patch.  If anyone has any objections, please let us know.

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

    From: Hugh Dickins <hughd@google.com>

    commit fd4a4663db293bfd5dc20fb4113977f62895e550 upstream.

    2.6.37 added an unmap_and_move_huge_page() for memory failure recovery,
    but its anon_vma handling was still based around the 2.6.35 conventions.
    Update it to use page_lock_anon_vma, get_anon_vma, page_unlock_anon_vma,
    drop_anon_vma in the same way as we're now changing unmap_and_move().

    I don't particularly like to propose this for stable when I've not seen
    its problems in practice nor tested the solution: but it's clearly out of
    synch at present.

    Signed-off-by: Hugh Dickins <hughd@google.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>
    Cc: Andi Kleen <ak@linux.intel.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@suse.de>

    ---
    mm/migrate.c | 23 ++++++-----------------
    1 file changed, 6 insertions(+), 17 deletions(-)

    --- a/mm/migrate.c
    +++ b/mm/migrate.c
    @@ -805,7 +805,6 @@ static int unmap_and_move_huge_page(new_
    int rc = 0;
    int *result = NULL;
    struct page *new_hpage = get_new_page(hpage, private, &result);
    - int rcu_locked = 0;
    struct anon_vma *anon_vma = NULL;

    if (!new_hpage)
    @@ -820,12 +819,10 @@ static int unmap_and_move_huge_page(new_
    }

    if (PageAnon(hpage)) {
    - rcu_read_lock();
    - rcu_locked = 1;
    -
    - if (page_mapped(hpage)) {
    - anon_vma = page_anon_vma(hpage);
    - atomic_inc(&anon_vma->external_refcount);
    + anon_vma = page_lock_anon_vma(hpage);
    + if (anon_vma) {
    + get_anon_vma(anon_vma);
    + page_unlock_anon_vma(anon_vma);
    }
    }

    @@ -837,16 +834,8 @@ static int unmap_and_move_huge_page(new_
    if (rc)
    remove_migration_ptes(hpage, hpage);

    - if (anon_vma && atomic_dec_and_lock(&anon_vma->external_refcount,
    - &anon_vma->lock)) {
    - int empty = list_empty(&anon_vma->head);
    - spin_unlock(&anon_vma->lock);
    - if (empty)
    - anon_vma_free(anon_vma);
    - }
    -
    - if (rcu_locked)
    - rcu_read_unlock();
    + if (anon_vma)
    + drop_anon_vma(anon_vma);
    out:
    unlock_page(hpage);




    \
     
     \ /
      Last update: 2011-02-16 01:29    [W:4.118 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site