From: Naoya Horiguchi <naoya.horiguchi@linux.dev>
To: linux-mm@kvack.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
Miaohe Lin <linmiaohe@huawei.com>,
David Hildenbrand <david@redhat.com>,
Mike Kravetz <mike.kravetz@oracle.com>,
Yang Shi <shy828301@gmail.com>,
Oscar Salvador <osalvador@suse.de>,
Muchun Song <songmuchun@bytedance.com>,
Naoya Horiguchi <naoya.horiguchi@nec.com>,
linux-kernel@vger.kernel.org
Subject: [RFC PATCH v1 1/4] mm, hwpoison, hugetlb: introduce SUBPAGE_INDEX_HWPOISON to save raw error page
Date: Wed, 27 Apr 2022 13:28:38 +0900 [thread overview]
Message-ID: <20220427042841.678351-2-naoya.horiguchi@linux.dev> (raw)
In-Reply-To: <20220427042841.678351-1-naoya.horiguchi@linux.dev>
From: Naoya Horiguchi <naoya.horiguchi@nec.com>
When handling memory error on a hugetlb page, the error handler tries to
dissolve and turn it into 4kB pages. If it's successfully dissolved,
PageHWPoison flag is moved to the raw error page, so but that's all
right. However, dissolve sometimes fails, then the error page is left
as hwpoisoned hugepage. It's useful if we can retry to dissolve it to
save healthy pages, but that's not possible now because the information
about where the raw error page is lost.
Use the private field of a tail page to keep that information. The code
path of shrinking hugepage pool used this info to try delayed dissolve.
Signed-off-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
---
include/linux/hugetlb.h | 24 ++++++++++++++++++++++++
mm/hugetlb.c | 9 +++++++++
mm/memory-failure.c | 2 ++
3 files changed, 35 insertions(+)
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index ac2a1d758a80..689e69cb556b 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -42,6 +42,9 @@ enum {
SUBPAGE_INDEX_CGROUP, /* reuse page->private */
SUBPAGE_INDEX_CGROUP_RSVD, /* reuse page->private */
__MAX_CGROUP_SUBPAGE_INDEX = SUBPAGE_INDEX_CGROUP_RSVD,
+#endif
+#ifdef CONFIG_CGROUP_HUGETLB
+ SUBPAGE_INDEX_HWPOISON,
#endif
__NR_USED_SUBPAGE,
};
@@ -784,6 +787,27 @@ extern int dissolve_free_huge_page(struct page *page);
extern int dissolve_free_huge_pages(unsigned long start_pfn,
unsigned long end_pfn);
+#ifdef CONFIG_MEMORY_FAILURE
+/*
+ * pointer to raw error page is located in hpage[SUBPAGE_INDEX_HWPOISON].private
+ */
+static inline struct page *hugetlb_page_hwpoison(struct page *hpage)
+{
+ return (void *)page_private(hpage + SUBPAGE_INDEX_HWPOISON);
+}
+
+static inline void hugetlb_set_page_hwpoison(struct page *hpage,
+ struct page *page)
+{
+ set_page_private(hpage + SUBPAGE_INDEX_HWPOISON, (unsigned long)page);
+}
+#else
+static inline struct page *hugetlb_page_hwpoison(struct page *hpage)
+{
+ return NULL;
+}
+#endif
+
#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
#ifndef arch_hugetlb_migration_supported
static inline bool arch_hugetlb_migration_supported(struct hstate *h)
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index f8e048b939c7..6867ea8345d1 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1547,6 +1547,15 @@ static void __update_and_free_page(struct hstate *h, struct page *page)
return;
}
+ if (unlikely(PageHWPoison(page))) {
+ struct page *raw_error = hugetlb_page_hwpoison(page);
+
+ if (raw_error && raw_error != page) {
+ SetPageHWPoison(raw_error);
+ ClearPageHWPoison(page);
+ }
+ }
+
for (i = 0; i < pages_per_huge_page(h);
i++, subpage = mem_map_next(subpage, page, i)) {
subpage->flags &= ~(1 << PG_locked | 1 << PG_error |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 3e36fc19c4d1..73948a00ad4a 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1535,6 +1535,8 @@ int __get_huge_page_for_hwpoison(unsigned long pfn, int flags)
goto out;
}
+ hugetlb_set_page_hwpoison(head, page);
+
return ret;
out:
if (count_increased)
--
2.25.1
next prev parent reply other threads:[~2022-04-27 4:28 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-27 4:28 [RFC PATCH v1 0/4] mm, hwpoison: improve handling workload related to hugetlb and memory_hotplug Naoya Horiguchi
2022-04-27 4:28 ` Naoya Horiguchi [this message]
2022-04-27 7:11 ` [RFC PATCH v1 1/4] mm, hwpoison, hugetlb: introduce SUBPAGE_INDEX_HWPOISON to save raw error page Miaohe Lin
2022-04-27 13:03 ` HORIGUCHI NAOYA(堀口 直也)
2022-04-28 3:14 ` Miaohe Lin
2022-05-12 22:31 ` Jane Chu
2022-05-12 22:49 ` HORIGUCHI NAOYA(堀口 直也)
2022-04-27 4:28 ` [RFC PATCH v1 2/4] mm,hwpoison,hugetlb,memory_hotplug: hotremove memory section with hwpoisoned hugepage Naoya Horiguchi
2022-04-29 8:49 ` Miaohe Lin
2022-05-09 7:55 ` HORIGUCHI NAOYA(堀口 直也)
2022-05-09 8:57 ` Miaohe Lin
2022-04-27 4:28 ` [RFC PATCH v1 3/4] mm, hwpoison: add parameter unpoison to get_hwpoison_huge_page() Naoya Horiguchi
2022-04-27 4:28 ` [RFC PATCH v1 4/4] mm, memory_hotplug: fix inconsistent num_poisoned_pages on memory hotremove Naoya Horiguchi
2022-04-28 3:20 ` Miaohe Lin
2022-04-28 4:05 ` HORIGUCHI NAOYA(堀口 直也)
2022-04-28 7:16 ` Miaohe Lin
2022-05-09 13:34 ` Naoya Horiguchi
2022-04-27 10:48 ` [RFC PATCH v1 0/4] mm, hwpoison: improve handling workload related to hugetlb and memory_hotplug David Hildenbrand
2022-04-27 12:20 ` Oscar Salvador
2022-04-27 12:20 ` HORIGUCHI NAOYA(堀口 直也)
2022-04-28 8:44 ` David Hildenbrand
2022-05-09 7:29 ` HORIGUCHI NAOYA(堀口 直也)
2022-05-09 9:04 ` Miaohe Lin
2022-05-09 9:58 ` Oscar Salvador
2022-05-09 10:53 ` Miaohe Lin
2022-05-11 15:11 ` David Hildenbrand
2022-05-11 16:10 ` HORIGUCHI NAOYA(堀口 直也)
2022-05-11 16:22 ` David Hildenbrand
2022-05-12 3:04 ` Miaohe Lin
2022-05-12 6:35 ` HORIGUCHI NAOYA(堀口 直也)
2022-05-12 7:28 ` David Hildenbrand
2022-05-12 11:13 ` Miaohe Lin
2022-05-12 12:59 ` David Hildenbrand
2022-05-16 3:25 ` Miaohe Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220427042841.678351-2-naoya.horiguchi@linux.dev \
--to=naoya.horiguchi@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linmiaohe@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mike.kravetz@oracle.com \
--cc=naoya.horiguchi@nec.com \
--cc=osalvador@suse.de \
--cc=shy828301@gmail.com \
--cc=songmuchun@bytedance.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).