lkml.org 
[lkml]   [2022]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[mm-unstable PATCH v4 6/9] mm, hwpoison: set PG_hwpoison for busy hugetlb pages
    Date
    From: Naoya Horiguchi <naoya.horiguchi@nec.com>

    If memory_failure() fails to grab page refcount on a hugetlb page
    because it's busy, it returns without setting PG_hwpoison on it.
    This not only loses a chance of error containment, but breaks the rule
    that action_result() should be called only when memory_failure() do
    any of handling work (even if that's just setting PG_hwpoison).
    This inconsistency could harm code maintainability.

    So set PG_hwpoison and call hugetlb_set_page_hwpoison() for such a case.

    Fixes: 405ce051236c ("mm/hwpoison: fix race between hugetlb free/demotion and memory_failure_hugetlb()")
    Signed-off-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
    ---
    include/linux/mm.h | 1 +
    mm/memory-failure.c | 8 ++++----
    2 files changed, 5 insertions(+), 4 deletions(-)

    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index 433bde7dcbf2..22f2dfe41c99 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -3235,6 +3235,7 @@ enum mf_flags {
    MF_SOFT_OFFLINE = 1 << 3,
    MF_UNPOISON = 1 << 4,
    MF_SW_SIMULATED = 1 << 5,
    + MF_NO_RETRY = 1 << 6,
    };
    int mf_dax_kill_procs(struct address_space *mapping, pgoff_t index,
    unsigned long count, int mf_flags);
    diff --git a/mm/memory-failure.c b/mm/memory-failure.c
    index 6af2096d8ea0..4233b21328a5 100644
    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -1782,7 +1782,8 @@ int __get_huge_page_for_hwpoison(unsigned long pfn, int flags)
    count_increased = true;
    } else {
    ret = -EBUSY;
    - goto out;
    + if (!(flags & MF_NO_RETRY))
    + goto out;
    }

    if (hugetlb_set_page_hwpoison(head, page)) {
    @@ -1810,7 +1811,6 @@ static int try_memory_failure_hugetlb(unsigned long pfn, int flags, int *hugetlb
    struct page *p = pfn_to_page(pfn);
    struct page *head;
    unsigned long page_flags;
    - bool retry = true;

    *hugetlb = 1;
    retry:
    @@ -1826,8 +1826,8 @@ static int try_memory_failure_hugetlb(unsigned long pfn, int flags, int *hugetlb
    }
    return res;
    } else if (res == -EBUSY) {
    - if (retry) {
    - retry = false;
    + if (!(flags & MF_NO_RETRY)) {
    + flags |= MF_NO_RETRY;
    goto retry;
    }
    action_result(pfn, MF_MSG_UNKNOWN, MF_IGNORED);
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-07-04 03:35    [W:4.073 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site