Hi, On 3/6/25 06:42, Balbir Singh wrote: ... > > /* > * The only time there is no vma is when called from > @@ -728,15 +1000,47 @@ static void __migrate_device_pages(unsigned long *src_pfns, > migrate->pgmap_owner); > mmu_notifier_invalidate_range_start(&range); > } > - migrate_vma_insert_page(migrate, addr, newpage, > + > + if ((src_pfns[i] & MIGRATE_PFN_COMPOUND) && > + (!(dst_pfns[i] & MIGRATE_PFN_COMPOUND))) { > + nr = HPAGE_PMD_NR; > + src_pfns[i] &= ~MIGRATE_PFN_COMPOUND; > + src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > + goto next; > + } > + > + migrate_vma_insert_page(migrate, addr, &dst_pfns[i], > &src_pfns[i]); > - continue; > + goto next; > } > > newfolio = page_folio(newpage); > folio = page_folio(page); > mapping = folio_mapping(folio); > > + /* > + * If THP migration is enabled, check if both src and dst > + * can migrate large pages > + */ > + if (thp_migration_supported()) { > + if ((src_pfns[i] & MIGRATE_PFN_MIGRATE) && > + (src_pfns[i] & MIGRATE_PFN_COMPOUND) && > + !(dst_pfns[i] & MIGRATE_PFN_COMPOUND)) { > + > + if (!migrate) { > + src_pfns[i] &= ~(MIGRATE_PFN_MIGRATE | > + MIGRATE_PFN_COMPOUND); > + goto next; > + } > + src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; This looks strange as is but patch 08 changes this to split and then migrate. > + } else if ((src_pfns[i] & MIGRATE_PFN_MIGRATE) && > + (dst_pfns[i] & MIGRATE_PFN_COMPOUND) && > + !(src_pfns[i] & MIGRATE_PFN_COMPOUND)) { > + src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; Should there be goto next; or similar here also, we are not migrating this src? > + } > + } > + > + > if (folio_is_device_private(newfolio) || > folio_is_device_coherent(newfolio)) { > if (mapping) { > @@ -749,7 +1053,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, > if (!folio_test_anon(folio) || > !folio_free_swap(folio)) { > src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > - continue; > + goto next; > } > } > } else if (folio_is_zone_device(newfolio)) { > @@ -757,7 +1061,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, > * Other types of ZONE_DEVICE page are not supported. > */ > src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > - continue; > + goto next; > } > > BUG_ON(folio_test_writeback(folio)); > @@ -769,6 +1073,8 @@ static void __migrate_device_pages(unsigned long *src_pfns, > src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; > else > folio_migrate_flags(newfolio, folio); > +next: > + i += nr; > } > > if (notified) > @@ -899,24 +1205,40 @@ EXPORT_SYMBOL(migrate_vma_finalize); > int migrate_device_range(unsigned long *src_pfns, unsigned long start, > unsigned long npages) > { > - unsigned long i, pfn; > + unsigned long i, j, pfn; > > - for (pfn = start, i = 0; i < npages; pfn++, i++) { > - struct folio *folio; > + i = 0; > + pfn = start; > + while (i < npages) { > + struct page *page = pfn_to_page(pfn); > + struct folio *folio = page_folio(page); > + unsigned int nr = 1; > > folio = folio_get_nontail_page(pfn_to_page(pfn)); > if (!folio) { > src_pfns[i] = 0; > - continue; > + goto next; > } > > if (!folio_trylock(folio)) { > src_pfns[i] = 0; > folio_put(folio); > - continue; > + goto next; > } > > src_pfns[i] = migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE; > + nr = folio_nr_pages(folio); > + if (nr > 1) { > + src_pfns[i] |= MIGRATE_PFN_COMPOUND; > + for (j = 1; j < nr; j++) > + src_pfns[i+j] = 0; > + i += j; > + pfn += j; > + continue; > + } > +next: > + i++; > + pfn++; > } > > migrate_device_unmap(src_pfns, npages, NULL); --Mika