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

Reply via email to