On 2/15/22 15:51, Mel Gorman wrote: > free_pcppages_bulk() prefetches buddies about to be freed but the > order must also be passed in as PCP lists store multiple orders. > > Fixes: 44042b449872 ("mm/page_alloc: allow high-order pages to be stored on the per-cpu lists") > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/page_alloc.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 3589febc6d31..08de32cfd9bb 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1432,10 +1432,10 @@ static bool bulkfree_pcp_prepare(struct page *page) > } > #endif /* CONFIG_DEBUG_VM */ > > -static inline void prefetch_buddy(struct page *page) > +static inline void prefetch_buddy(struct page *page, unsigned int order) > { > unsigned long pfn = page_to_pfn(page); > - unsigned long buddy_pfn = __find_buddy_pfn(pfn, 0); > + unsigned long buddy_pfn = __find_buddy_pfn(pfn, order); > struct page *buddy = page + (buddy_pfn - pfn); > > prefetch(buddy); > @@ -1512,7 +1512,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, > * prefetch buddy for the first pcp->batch nr of pages. > */ > if (prefetch_nr) { > - prefetch_buddy(page); > + prefetch_buddy(page, order); > prefetch_nr--; > } > } while (count > 0 && --batch_free && !list_empty(list));