There's no need to hide the llist_head; we can just declare it directly in struct folio and do away with raw_hwp_list_head(). Signed-off-by: Matthew Wilcox (Oracle) --- include/linux/mm_types.h | 4 ++-- mm/memory-failure.c | 19 +++++-------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index b18c2b2e7d2c..d7a9b0d8bbdf 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -387,7 +387,7 @@ typedef unsigned short mm_id_t; * @_hugetlb_subpool: Do not use directly, use accessor in hugetlb.h. * @_hugetlb_cgroup: Do not use directly, use accessor in hugetlb_cgroup.h. * @_hugetlb_cgroup_rsvd: Do not use directly, use accessor in hugetlb_cgroup.h. - * @_hugetlb_hwpoison: Do not use directly, call raw_hwp_list_head(). + * @hugetlb_hwpoison: List of pages with hwpoison. * @_deferred_list: Folios to be split under memory pressure. * @_unused_slab_obj_exts: Placeholder to match obj_exts in struct slab. * @@ -499,7 +499,7 @@ struct folio { void *_hugetlb_subpool; void *_hugetlb_cgroup; void *_hugetlb_cgroup_rsvd; - void *_hugetlb_hwpoison; + struct llist_head hugetlb_hwpoison; /* private: the union with struct page is transitional */ }; struct page __page_3; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 3615ced0a11b..18691c905ac9 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1810,21 +1810,15 @@ EXPORT_SYMBOL_GPL(mf_dax_kill_procs); /* * Struct raw_hwp_page represents information about "raw error page", - * constructing singly linked list from ->_hugetlb_hwpoison field of folio. + * constructing singly linked list from folio->hugetlb_hwpoison field. */ struct raw_hwp_page { struct llist_node node; struct page *page; }; -static inline struct llist_head *raw_hwp_list_head(struct folio *folio) -{ - return (struct llist_head *)&folio->_hugetlb_hwpoison; -} - bool is_raw_hwpoison_page_in_hugepage(struct page *page) { - struct llist_head *raw_hwp_head; struct raw_hwp_page *p; struct folio *folio = page_folio(page); bool ret = false; @@ -1844,8 +1838,7 @@ bool is_raw_hwpoison_page_in_hugepage(struct page *page) mutex_lock(&mf_mutex); - raw_hwp_head = raw_hwp_list_head(folio); - llist_for_each_entry(p, raw_hwp_head->first, node) { + llist_for_each_entry(p, folio->hugetlb_hwpoison.first, node) { if (page == p->page) { ret = true; break; @@ -1863,7 +1856,7 @@ static unsigned long __folio_free_raw_hwp(struct folio *folio, bool move_flag) struct raw_hwp_page *p, *next; unsigned long count = 0; - head = llist_del_all(raw_hwp_list_head(folio)); + head = llist_del_all(&folio->hugetlb_hwpoison); llist_for_each_entry_safe(p, next, head, node) { if (move_flag) SetPageHWPoison(p->page); @@ -1887,7 +1880,6 @@ static unsigned long __folio_free_raw_hwp(struct folio *folio, bool move_flag) */ static int hugetlb_update_hwpoison(struct folio *folio, struct page *page) { - struct llist_head *head; struct raw_hwp_page *raw_hwp; struct raw_hwp_page *p; int ret = folio_test_set_hwpoison(folio) ? MF_HUGETLB_FOLIO_PRE_POISONED : 0; @@ -1899,8 +1891,7 @@ static int hugetlb_update_hwpoison(struct folio *folio, struct page *page) */ if (folio_test_hugetlb_raw_hwp_unreliable(folio)) return MF_HUGETLB_FOLIO_PRE_POISONED; - head = raw_hwp_list_head(folio); - llist_for_each_entry(p, head->first, node) { + llist_for_each_entry(p, folio->hugetlb_hwpoison.first, node) { if (p->page == page) return MF_HUGETLB_PAGE_PRE_POISONED; } @@ -1908,7 +1899,7 @@ static int hugetlb_update_hwpoison(struct folio *folio, struct page *page) raw_hwp = kmalloc_obj(struct raw_hwp_page, GFP_ATOMIC); if (raw_hwp) { raw_hwp->page = page; - llist_add(&raw_hwp->node, head); + llist_add(&raw_hwp->node, &folio->hugetlb_hwpoison); } else { /* * Failed to save raw error info. We no longer trace all -- 2.47.3