lkml.org 
[lkml]   [2020]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 07/14] mm,hwpoison: unify THP handling for hard and soft offline
    Date
    Place the THP's page handling in a helper and use it from both hard and
    soft-offline machinery, so we get rid of some duplicated code.

    Signed-off-by: Oscar Salvador <osalvador@suse.de>
    ---
    mm/memory-failure.c | 48 +++++++++++++++++++++------------------------
    1 file changed, 22 insertions(+), 26 deletions(-)

    diff --git a/mm/memory-failure.c b/mm/memory-failure.c
    index ed54c27ad668..9d80beb841a3 100644
    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -1102,6 +1102,25 @@ static int identify_page_state(unsigned long pfn, struct page *p,
    return page_action(ps, p, pfn);
    }

    +static int try_to_split_thp_page(struct page *page, const char *msg)
    +{
    + lock_page(page);
    + if (!PageAnon(page) || unlikely(split_huge_page(page))) {
    + unsigned long pfn = page_to_pfn(page);
    +
    + unlock_page(page);
    + if (!PageAnon(page))
    + pr_info("%s: %#lx: non anonymous thp\n", msg, pfn);
    + else
    + pr_info("%s: %#lx: thp split failed\n", msg, pfn);
    + put_page(page);
    + return -EBUSY;
    + }
    + unlock_page(page);
    +
    + return 0;
    +}
    +
    static int memory_failure_hugetlb(unsigned long pfn, int flags)
    {
    struct page *p = pfn_to_page(pfn);
    @@ -1324,21 +1343,8 @@ int memory_failure(unsigned long pfn, int flags)
    }

    if (PageTransHuge(hpage)) {
    - lock_page(p);
    - if (!PageAnon(p) || unlikely(split_huge_page(p))) {
    - unlock_page(p);
    - if (!PageAnon(p))
    - pr_err("Memory failure: %#lx: non anonymous thp\n",
    - pfn);
    - else
    - pr_err("Memory failure: %#lx: thp split failed\n",
    - pfn);
    - if (TestClearPageHWPoison(p))
    - num_poisoned_pages_dec();
    - put_page(p);
    + if (try_to_split_thp_page(p, "Memory Failure") < 0)
    return -EBUSY;
    - }
    - unlock_page(p);
    VM_BUG_ON_PAGE(!page_count(p), p);
    }

    @@ -1855,19 +1861,9 @@ static int soft_offline_in_use_page(struct page *page, int flags)
    int mt;
    struct page *hpage = compound_head(page);

    - if (!PageHuge(page) && PageTransHuge(hpage)) {
    - lock_page(page);
    - if (!PageAnon(page) || unlikely(split_huge_page(page))) {
    - unlock_page(page);
    - if (!PageAnon(page))
    - 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_page(page);
    + if (!PageHuge(page) && PageTransHuge(hpage))
    + if (try_to_split_thp_page(page, "soft offline") < 0)
    return -EBUSY;
    - }
    - unlock_page(page);
    - }

    /*
    * Setting MIGRATE_ISOLATE here ensures that the page will be linked
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-09-22 15:58    [W:2.214 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site