On 2024/3/1 5:20, Matthew Wilcox (Oracle) wrote: > Saves dozens of calls to compound_head(). > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > mm/memory-failure.c | 40 +++++++++++++++++++++------------------- > 1 file changed, 21 insertions(+), 19 deletions(-) > > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index fe4959e994d0..74e87a0a792c 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -2189,7 +2189,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, > int memory_failure(unsigned long pfn, int flags) > { > struct page *p; > - struct page *hpage; > + struct folio *folio; > struct dev_pagemap *pgmap; > int res = 0; > unsigned long page_flags; > @@ -2277,8 +2277,8 @@ int memory_failure(unsigned long pfn, int flags) > } > } > > - hpage = compound_head(p); > - if (PageTransHuge(hpage)) { > + folio = page_folio(p); > + if (folio_test_large(folio)) { > /* > * The flag must be set after the refcount is bumped > * otherwise it may race with THP split. > @@ -2292,12 +2292,13 @@ int memory_failure(unsigned long pfn, int flags) > * or unhandlable page. The refcount is bumped iff the > * page is a valid handlable page. > */ > - SetPageHasHWPoisoned(hpage); > + folio_set_has_hwpoisoned(folio); > if (try_to_split_thp_page(p) < 0) { > res = action_result(pfn, MF_MSG_UNSPLIT_THP, MF_IGNORED); > goto unlock_mutex; > } > VM_BUG_ON_PAGE(!page_count(p), p); > + folio = page_folio(p); > } > > /* > @@ -2308,9 +2309,9 @@ int memory_failure(unsigned long pfn, int flags) > * The check (unnecessarily) ignores LRU pages being isolated and > * walked by the page reclaim code, however that's not a big loss. > */ > - shake_page(p); > + shake_folio(folio); > > - lock_page(p); > + folio_lock(folio); > > /* > * We're only intended to deal with the non-Compound page here. > @@ -2318,11 +2319,11 @@ int memory_failure(unsigned long pfn, int flags) > * race window. If this happens, we could try again to hopefully > * handle the page next round. > */ > - if (PageCompound(p)) { > + if (folio_test_large(folio)) { folio_test_large() only checks whether PG_head is set but PageCompound() also checks PageTail(). So folio_test_large() and PageCompound() are not equivalent? Thanks.