On 2024/3/21 22:24, Matthew Wilcox (Oracle) wrote: > For compound pages which are at least order-2 (and hence have a > deferred_list), initialise it and then we can check at free that the > page is not part of a deferred list. We recently found this useful to > rule out a source of corruption. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > mm/huge_memory.c | 2 -- > mm/hugetlb.c | 3 ++- > mm/internal.h | 2 ++ > mm/memcontrol.c | 2 ++ > mm/page_alloc.c | 9 +++++---- > 5 files changed, 11 insertions(+), 7 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 9859aa4f7553..04fb994a7b0b 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -792,8 +792,6 @@ void folio_prep_large_rmappable(struct folio *folio) > { > if (!folio || !folio_test_large(folio)) > return; > - if (folio_order(folio) > 1) > - INIT_LIST_HEAD(&folio->_deferred_list); > folio_set_large_rmappable(folio); > } > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index 23ef240ba48a..7e9a766059aa 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -1796,7 +1796,8 @@ static void __update_and_free_hugetlb_folio(struct hstate *h, > destroy_compound_gigantic_folio(folio, huge_page_order(h)); > free_gigantic_folio(folio, huge_page_order(h)); > } else { > - __free_pages(&folio->page, huge_page_order(h)); > + INIT_LIST_HEAD(&folio->_deferred_list); Will it be better to add a comment to explain why INIT_LIST_HEAD is needed ? > + folio_put(folio); Can all __free_pages be replaced with folio_put in mm/hugetlb.c? Thanks.