On 1/15/26 06:19, Francois Dugast wrote: > If the page is part of a folio, unlock and put the whole folio at once > instead of individual pages one after the other. This will reduce the > amount of operations once device THP are in use. > > Cc: Andrew Morton <[email protected]> > Cc: David Hildenbrand <[email protected]> > Cc: Lorenzo Stoakes <[email protected]> > Cc: Liam R. Howlett <[email protected]> > Cc: Vlastimil Babka <[email protected]> > Cc: Mike Rapoport <[email protected]> > Cc: Suren Baghdasaryan <[email protected]> > Cc: Michal Hocko <[email protected]> > Cc: Zi Yan <[email protected]> > Cc: Alistair Popple <[email protected]> > Cc: Balbir Singh <[email protected]> > Cc: [email protected] > Suggested-by: Matthew Brost <[email protected]> > Reviewed-by: Matthew Brost <[email protected]> > Signed-off-by: Francois Dugast <[email protected]> > --- > drivers/gpu/drm/drm_pagemap.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/drm_pagemap.c b/drivers/gpu/drm/drm_pagemap.c > index c497726b0147..b31090b8e97c 100644 > --- a/drivers/gpu/drm/drm_pagemap.c > +++ b/drivers/gpu/drm/drm_pagemap.c > @@ -154,15 +154,15 @@ static void drm_pagemap_zdd_put(struct drm_pagemap_zdd > *zdd) > } > > /** > - * drm_pagemap_migration_unlock_put_page() - Put a migration page > - * @page: Pointer to the page to put > + * drm_pagemap_migration_unlock_put_folio() - Put a migration folio > + * @folio: Pointer to the folio to put > * > - * This function unlocks and puts a page. > + * This function unlocks and puts a folio. > */ > -static void drm_pagemap_migration_unlock_put_page(struct page *page) > +static void drm_pagemap_migration_unlock_put_folio(struct folio *folio) > { > - unlock_page(page); > - put_page(page); > + folio_unlock(folio); > + folio_put(folio); > } > > /** > @@ -177,15 +177,23 @@ static void > drm_pagemap_migration_unlock_put_pages(unsigned long npages, > { > unsigned long i; > > - for (i = 0; i < npages; ++i) { > + for (i = 0; i < npages;) { > struct page *page; > + struct folio *folio; > + unsigned int order = 0; > > if (!migrate_pfn[i]) > - continue; > + goto next; > > page = migrate_pfn_to_page(migrate_pfn[i]); > - drm_pagemap_migration_unlock_put_page(page); > + folio = page_folio(page); > + order = folio_order(folio); > + > + drm_pagemap_migration_unlock_put_folio(folio); > migrate_pfn[i] = 0; > + > +next: > + i += NR_PAGES(order);
Is this just a wrapper on top of folio_nr_pages()? > } > } > Reviewed-by: Balbir Singh <[email protected]>
