mm/memory-failure: convert raw_hwp_list_head() to folios

Change raw_hwp_list_head() to take in a folio and modify its callers to
pass in a folio.  Also converts two users of hugetlb specific page macro
users to their folio equivalents.

Link: https://lkml.kernel.org/r/20230112204608.80136-6-sidhartha.kumar@oracle.com
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Sidhartha Kumar 2023-01-12 14:46:05 -06:00 committed by Andrew Morton
parent 9637d7dfb1
commit b02e7582ef

View File

@ -1695,9 +1695,9 @@ struct raw_hwp_page {
struct page *page; struct page *page;
}; };
static inline struct llist_head *raw_hwp_list_head(struct page *hpage) static inline struct llist_head *raw_hwp_list_head(struct folio *folio)
{ {
return (struct llist_head *)&page_folio(hpage)->_hugetlb_hwpoison; return (struct llist_head *)&folio->_hugetlb_hwpoison;
} }
static unsigned long __free_raw_hwp_pages(struct page *hpage, bool move_flag) static unsigned long __free_raw_hwp_pages(struct page *hpage, bool move_flag)
@ -1705,8 +1705,9 @@ static unsigned long __free_raw_hwp_pages(struct page *hpage, bool move_flag)
struct llist_head *head; struct llist_head *head;
struct llist_node *t, *tnode; struct llist_node *t, *tnode;
unsigned long count = 0; unsigned long count = 0;
struct folio *folio = page_folio(hpage);
head = raw_hwp_list_head(hpage); head = raw_hwp_list_head(folio);
llist_for_each_safe(tnode, t, head->first) { llist_for_each_safe(tnode, t, head->first) {
struct raw_hwp_page *p = container_of(tnode, struct raw_hwp_page, node); struct raw_hwp_page *p = container_of(tnode, struct raw_hwp_page, node);
@ -1727,15 +1728,16 @@ static int hugetlb_set_page_hwpoison(struct page *hpage, struct page *page)
struct raw_hwp_page *raw_hwp; struct raw_hwp_page *raw_hwp;
struct llist_node *t, *tnode; struct llist_node *t, *tnode;
int ret = TestSetPageHWPoison(hpage) ? -EHWPOISON : 0; int ret = TestSetPageHWPoison(hpage) ? -EHWPOISON : 0;
struct folio *folio = page_folio(hpage);
/* /*
* Once the hwpoison hugepage has lost reliable raw error info, * Once the hwpoison hugepage has lost reliable raw error info,
* there is little meaning to keep additional error info precisely, * there is little meaning to keep additional error info precisely,
* so skip to add additional raw error info. * so skip to add additional raw error info.
*/ */
if (HPageRawHwpUnreliable(hpage)) if (folio_test_hugetlb_raw_hwp_unreliable(folio))
return -EHWPOISON; return -EHWPOISON;
head = raw_hwp_list_head(hpage); head = raw_hwp_list_head(folio);
llist_for_each_safe(tnode, t, head->first) { llist_for_each_safe(tnode, t, head->first) {
struct raw_hwp_page *p = container_of(tnode, struct raw_hwp_page, node); struct raw_hwp_page *p = container_of(tnode, struct raw_hwp_page, node);
@ -1756,9 +1758,9 @@ static int hugetlb_set_page_hwpoison(struct page *hpage, struct page *page)
* hwpoisoned subpages, and we need refuse to free/dissolve * hwpoisoned subpages, and we need refuse to free/dissolve
* this hwpoisoned hugepage. * this hwpoisoned hugepage.
*/ */
SetHPageRawHwpUnreliable(hpage); folio_set_hugetlb_raw_hwp_unreliable(folio);
/* /*
* Once HPageRawHwpUnreliable is set, raw_hwp_page is not * Once hugetlb_raw_hwp_unreliable is set, raw_hwp_page is not
* used any more, so free it. * used any more, so free it.
*/ */
__free_raw_hwp_pages(hpage, false); __free_raw_hwp_pages(hpage, false);