On Fri, Jan 16, 2026 at 10:37:15PM +1100, Balbir Singh wrote: > On 1/16/26 22:10, Francois Dugast wrote: > > From: Matthew Brost <[email protected]> > > > > cpages returned from migrate_vma_setup represents the total number of > > individual pages found, not the number of 4K pages. The math in > > drm_pagemap_migrate_to_devmem for npages is based on the number of 4K > > pages, so cpages != npages can fail even if the entire memory range is > > found in migrate_vma_setup (e.g., when a single 2M page is found). > > Add drm_pagemap_cpages, which converts cpages to the number of 4K pages > > found. > > > > 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] > > Signed-off-by: Matthew Brost <[email protected]> > > Reviewed-by: Francois Dugast <[email protected]> > > Signed-off-by: Francois Dugast <[email protected]> > > --- > > drivers/gpu/drm/drm_pagemap.c | 38 ++++++++++++++++++++++++++++++++++- > > 1 file changed, 37 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/drm_pagemap.c b/drivers/gpu/drm/drm_pagemap.c > > index 61c6ca59df81..801da343f0a6 100644 > > --- a/drivers/gpu/drm/drm_pagemap.c > > +++ b/drivers/gpu/drm/drm_pagemap.c > > @@ -452,6 +452,41 @@ static int drm_pagemap_migrate_range(struct > > drm_pagemap_devmem *devmem, > > return ret; > > } > > > > +/** > > + * drm_pagemap_cpages() - Count collected pages > > + * @migrate_pfn: Array of migrate_pfn entries to account > > + * @npages: Number of entries in @migrate_pfn > > + * > > + * Compute the total number of minimum-sized pages represented by the > > + * collected entries in @migrate_pfn. The total is derived from the > > + * order encoded in each entry. > > + * > > + * Return: Total number of minimum-sized pages. > > + */ > > +static int drm_pagemap_cpages(unsigned long *migrate_pfn, unsigned long > > npages) > > +{ > > + unsigned long i, cpages = 0; > > + > > + for (i = 0; i < npages;) { > > + struct page *page = migrate_pfn_to_page(migrate_pfn[i]); > > + struct folio *folio; > > + unsigned int order = 0; > > + > > + if (page) { > > + folio = page_folio(page); > > + order = folio_order(folio); > > + cpages += NR_PAGES(order); > > + } else if (migrate_pfn[i] & MIGRATE_PFN_COMPOUND) { > > + order = HPAGE_PMD_ORDER; > > + cpages += NR_PAGES(order); > > + } > > + > > + i += NR_PAGES(order); > > + } > > + > > + return cpages; > > +} > > + > > /** > > * drm_pagemap_migrate_to_devmem() - Migrate a struct mm_struct range to > > device memory > > * @devmem_allocation: The device memory allocation to migrate to. > > @@ -564,7 +599,8 @@ int drm_pagemap_migrate_to_devmem(struct > > drm_pagemap_devmem *devmem_allocation, > > goto err_free; > > } > > > > - if (migrate.cpages != npages) { > > + if (migrate.cpages != npages && > > + drm_pagemap_cpages(migrate.src, npages) != npages) { > > /* > > * Some pages to migrate. But we want to migrate all or > > * nothing. Raced or unknown device pages. > > I thought I did for the previous revision, but
You did for patch #2, it was kept in this revision. > > Reviewed-by: Balbir Singh <[email protected]> Thanks Balbir! Francois
