lkml.org 
[lkml]   [2016]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 08/12] mm: hwpoison: soft offline supports thp migration
    Date
    From: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

    This patch enables thp migration for soft offline.

    Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    ---
    mm/memory-failure.c | 31 ++++++++++++-------------------
    1 file changed, 12 insertions(+), 19 deletions(-)

    diff --git a/mm/memory-failure.c b/mm/memory-failure.c
    index e105f91..36eb064 100644
    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -1494,7 +1494,17 @@ static struct page *new_page(struct page *p, unsigned long private, int **x)
    if (PageHuge(p))
    return alloc_huge_page_node(page_hstate(compound_head(p)),
    nid);
    - else
    + else if (thp_migration_supported() && PageTransHuge(p)) {
    + struct page *thp;
    +
    + thp = alloc_pages_node(nid,
    + (GFP_TRANSHUGE | __GFP_THISNODE) & ~__GFP_RECLAIM,
    + HPAGE_PMD_ORDER);
    + if (!thp)
    + return NULL;
    + prep_transhuge_page(thp);
    + return thp;
    + } else
    return __alloc_pages_node(nid, GFP_HIGHUSER_MOVABLE, 0);
    }

    @@ -1697,28 +1707,11 @@ static int __soft_offline_page(struct page *page, int flags)
    static int soft_offline_in_use_page(struct page *page, int flags)
    {
    int ret;
    - struct page *hpage = compound_head(page);
    -
    - if (!PageHuge(page) && PageTransHuge(hpage)) {
    - lock_page(hpage);
    - if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) {
    - unlock_page(hpage);
    - if (!PageAnon(hpage))
    - pr_info("soft offline: %#lx: non anonymous thp\n", page_to_pfn(page));
    - else
    - pr_info("soft offline: %#lx: thp split failed\n", page_to_pfn(page));
    - put_hwpoison_page(hpage);
    - return -EBUSY;
    - }
    - unlock_page(hpage);
    - get_hwpoison_page(page);
    - put_hwpoison_page(hpage);
    - }

    if (PageHuge(page))
    ret = soft_offline_huge_page(page, flags);
    else
    - ret = __soft_offline_page(page, flags);
    + ret = __soft_offline_page(compound_head(page), flags);

    return ret;
    }
    --
    2.9.3
    \
     
     \ /
      Last update: 2016-09-26 17:27    [W:4.054 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site