| From b4e61fc031b11dd807dffc46cebbf0e25966d3d1 Mon Sep 17 00:00:00 2001 |
| From: Xu Yu <xuyu@linux.alibaba.com> |
| Date: Thu, 28 Apr 2022 23:14:43 -0700 |
| Subject: Revert "mm/memory-failure.c: skip huge_zero_page in memory_failure()" |
| |
| From: Xu Yu <xuyu@linux.alibaba.com> |
| |
| commit b4e61fc031b11dd807dffc46cebbf0e25966d3d1 upstream. |
| |
| Patch series "mm/memory-failure: rework fix on huge_zero_page splitting". |
| |
| |
| This patch (of 2): |
| |
| This reverts commit d173d5417fb67411e623d394aab986d847e47dad. |
| |
| The commit d173d5417fb6 ("mm/memory-failure.c: skip huge_zero_page in |
| memory_failure()") explicitly skips huge_zero_page in memory_failure(), in |
| order to avoid triggering VM_BUG_ON_PAGE on huge_zero_page in |
| split_huge_page_to_list(). |
| |
| This works, but Yang Shi thinks that, |
| |
| Raising BUG is overkilling for splitting huge_zero_page. The |
| huge_zero_page can't be met from normal paths other than memory |
| failure, but memory failure is a valid caller. So I tend to replace |
| the BUG to WARN + returning -EBUSY. If we don't care about the |
| reason code in memory failure, we don't have to touch memory |
| failure. |
| |
| And for the issue that huge_zero_page will be set PG_has_hwpoisoned, |
| Yang Shi comments that, |
| |
| The anonymous page fault doesn't check if the page is poisoned or |
| not since it typically gets a fresh allocated page and assumes the |
| poisoned page (isolated successfully) can't be reallocated again. |
| But huge zero page and base zero page are reused every time. So no |
| matter what fix we pick, the issue is always there. |
| |
| Finally, Yang, David, Anshuman and Naoya all agree to fix the bug, i.e., |
| to split huge_zero_page, in split_huge_page_to_list(). |
| |
| This reverts the commit d173d5417fb6 ("mm/memory-failure.c: skip |
| huge_zero_page in memory_failure()"), and the original bug will be fixed |
| by the next patch. |
| |
| Link: https://lkml.kernel.org/r/872cefb182ba1dd686b0e7db1e6b2ebe5a4fff87.1651039624.git.xuyu@linux.alibaba.com |
| Fixes: d173d5417fb6 ("mm/memory-failure.c: skip huge_zero_page in memory_failure()") |
| Fixes: 6a46079cf57a ("HWPOISON: The high level memory error handler in the VM v7") |
| Signed-off-by: Xu Yu <xuyu@linux.alibaba.com> |
| Suggested-by: Yang Shi <shy828301@gmail.com> |
| Reviewed-by: Yang Shi <shy828301@gmail.com> |
| Reviewed-by: Miaohe Lin <linmiaohe@huawei.com> |
| Cc: Naoya Horiguchi <naoya.horiguchi@nec.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| mm/memory-failure.c | 13 ------------- |
| 1 file changed, 13 deletions(-) |
| |
| --- a/mm/memory-failure.c |
| +++ b/mm/memory-failure.c |
| @@ -1692,19 +1692,6 @@ try_again: |
| |
| if (PageTransHuge(hpage)) { |
| /* |
| - * Bail out before SetPageHasHWPoisoned() if hpage is |
| - * huge_zero_page, although PG_has_hwpoisoned is not |
| - * checked in set_huge_zero_page(). |
| - * |
| - * TODO: Handle memory failure of huge_zero_page thoroughly. |
| - */ |
| - if (is_huge_zero_page(hpage)) { |
| - action_result(pfn, MF_MSG_UNSPLIT_THP, MF_IGNORED); |
| - res = -EBUSY; |
| - goto unlock_mutex; |
| - } |
| - |
| - /* |
| * The flag must be set after the refcount is bumped |
| * otherwise it may race with THP split. |
| * And the flag can't be set in get_hwpoison_page() since |