On Thu, Aug 31, 2023 at 04:21:53PM +0100, Ryan Roberts wrote: > On 25/08/2023 14:59, Matthew Wilcox (Oracle) wrote: > > @@ -2478,7 +2478,11 @@ void free_unref_folios(struct folio_batch *folios) > > for (i = 0, j = 0; i < folios->nr; i++) { > > struct folio *folio = folios->folios[i]; > > unsigned long pfn = folio_pfn(folio); > > - if (!free_unref_page_prepare(&folio->page, pfn, 0)) > > + unsigned int order = folio_order(folio); > > Do you need to do anything special for hugetlb folios? I see that > destroy_large_folio() has: > > if (folio_test_hugetlb(folio)) { > free_huge_folio(folio); > return; > } Right; hugetlb folios get freed specially and never come this way. I could put in an assertion, I suppose? > > @@ -2486,11 +2490,13 @@ void free_unref_folios(struct folio_batch *folios) > > * comment in free_unref_page. > > */ > > migratetype = get_pcppage_migratetype(&folio->page); > > - if (unlikely(is_migrate_isolate(migratetype))) { > > + if (order > PAGE_ALLOC_COSTLY_ORDER || > > Should this be `if (!pcp_allowed_order(order) ||` ? That helper includes the THP > pageblock_order too. Oh, yes, that's obviously far better than what I had here. I got the BUG in order_to_pindex() and didn't think to look around for the correct predicate. Thanks!