lkml.org 
[lkml]   [2011]   [Jan]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] migration: Fix page corruption during hugepage migration
    Date
    If migrate_huge_page by memory-failure fails , it calls put_page in itself
    to decrease page reference and caller of migrate_huge_page also calls
    putback_lru_pages. It can do double free of page so it can make page
    corruption on page holder.

    In addtion, clean of pages on caller is consistent behavior with
    migrate_pages by cf608ac19c95804dc2df43b1f4f9e0.

    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Signed-off-by: Minchan Kim <minchan.kim@gmail.com>
    ---
    mm/memory-failure.c | 5 ++++-
    mm/migrate.c | 4 ----
    2 files changed, 4 insertions(+), 5 deletions(-)

    diff --git a/mm/memory-failure.c b/mm/memory-failure.c
    index 75398b0..237aaa4 100644
    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -1295,7 +1295,10 @@ static int soft_offline_huge_page(struct page *page, int flags)
    ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, 0,
    true);
    if (ret) {
    - putback_lru_pages(&pagelist);
    + struct page *page1, *page2;
    + list_for_each_entry_safe(page1, page2, &pagelist, lru)
    + put_page(page1);
    +
    pr_debug("soft offline: %#lx: migration failed %d, type %lx\n",
    pfn, ret, page->flags);
    if (ret > 0)
    diff --git a/mm/migrate.c b/mm/migrate.c
    index 7d34237..3a6d4fd 100644
    --- a/mm/migrate.c
    +++ b/mm/migrate.c
    @@ -980,10 +980,6 @@ int migrate_huge_pages(struct list_head *from,
    }
    rc = 0;
    out:
    -
    - list_for_each_entry_safe(page, page2, from, lru)
    - put_page(page);
    -
    if (rc)
    return rc;

    --
    1.7.0.4


    \
     
     \ /
      Last update: 2011-01-20 17:19    [W:4.612 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site