The patch titled Subject: mm/migrate_device: page_remove_rmap() -> folio_remove_rmap_pte() has been added to the -mm mm-unstable branch. Its filename is mm-migrate_device-page_remove_rmap-folio_remove_rmap_pte.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-migrate_device-page_remove_rmap-folio_remove_rmap_pte.patch This patch will later appear in the mm-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: David Hildenbrand <david@xxxxxxxxxx> Subject: mm/migrate_device: page_remove_rmap() -> folio_remove_rmap_pte() Date: Wed, 20 Dec 2023 23:44:53 +0100 Let's convert migrate_vma_collect_pmd(). While at it, perform more folio conversion. Link: https://lkml.kernel.org/r/20231220224504.646757-30-david@xxxxxxxxxx Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Cc: Hugh Dickins <hughd@xxxxxxxxxx> Cc: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Cc: Muchun Song <muchun.song@xxxxxxxxx> Cc: Muchun Song <songmuchun@xxxxxxxxxxxxx> Cc: Peter Xu <peterx@xxxxxxxxxx> Cc: Ryan Roberts <ryan.roberts@xxxxxxx> Cc: Yin Fengwei <fengwei.yin@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/migrate_device.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) --- a/mm/migrate_device.c~mm-migrate_device-page_remove_rmap-folio_remove_rmap_pte +++ a/mm/migrate_device.c @@ -107,6 +107,7 @@ again: for (; addr < end; addr += PAGE_SIZE, ptep++) { unsigned long mpfn = 0, pfn; + struct folio *folio; struct page *page; swp_entry_t entry; pte_t pte; @@ -168,41 +169,43 @@ again: } /* - * By getting a reference on the page we pin it and that blocks + * By getting a reference on the folio we pin it and that blocks * any kind of migration. Side effect is that it "freezes" the * pte. * - * We drop this reference after isolating the page from the lru - * for non device page (device page are not on the lru and thus + * We drop this reference after isolating the folio from the lru + * for non device folio (device folio are not on the lru and thus * can't be dropped from it). */ - get_page(page); + folio = page_folio(page); + folio_get(folio); /* - * We rely on trylock_page() to avoid deadlock between + * We rely on folio_trylock() to avoid deadlock between * concurrent migrations where each is waiting on the others - * page lock. If we can't immediately lock the page we fail this + * folio lock. If we can't immediately lock the folio we fail this * migration as it is only best effort anyway. * - * If we can lock the page it's safe to set up a migration entry - * now. In the common case where the page is mapped once in a + * If we can lock the folio it's safe to set up a migration entry + * now. In the common case where the folio is mapped once in a * single process setting up the migration entry now is an * optimisation to avoid walking the rmap later with * try_to_migrate(). */ - if (trylock_page(page)) { + if (folio_trylock(folio)) { bool anon_exclusive; pte_t swp_pte; flush_cache_page(vma, addr, pte_pfn(pte)); - anon_exclusive = PageAnon(page) && PageAnonExclusive(page); + anon_exclusive = folio_test_anon(folio) && + PageAnonExclusive(page); if (anon_exclusive) { pte = ptep_clear_flush(vma, addr, ptep); if (page_try_share_anon_rmap(page)) { set_pte_at(mm, addr, ptep, pte); - unlock_page(page); - put_page(page); + folio_unlock(folio); + folio_put(folio); mpfn = 0; goto next; } @@ -214,7 +217,7 @@ again: /* Set the dirty flag on the folio now the pte is gone. */ if (pte_dirty(pte)) - folio_mark_dirty(page_folio(page)); + folio_mark_dirty(folio); /* Setup special migration page table entry */ if (mpfn & MIGRATE_PFN_WRITE) @@ -248,16 +251,16 @@ again: /* * This is like regular unmap: we remove the rmap and - * drop page refcount. Page won't be freed, as we took - * a reference just above. + * drop the folio refcount. The folio won't be freed, as + * we took a reference just above. */ - page_remove_rmap(page, vma, false); - put_page(page); + folio_remove_rmap_pte(folio, page, vma); + folio_put(folio); if (pte_present(pte)) unmapped++; } else { - put_page(page); + folio_put(folio); mpfn = 0; } _ Patches currently in -mm which might be from david@xxxxxxxxxx are mm-rmap-rename-hugepage_add-to-hugetlb_add.patch mm-rmap-introduce-and-use-hugetlb_remove_rmap.patch mm-rmap-introduce-and-use-hugetlb_add_file_rmap.patch mm-rmap-introduce-and-use-hugetlb_try_dup_anon_rmap.patch mm-rmap-introduce-and-use-hugetlb_try_share_anon_rmap.patch mm-rmap-add-hugetlb-sanity-checks-for-anon-rmap-handling.patch mm-rmap-convert-folio_add_file_rmap_range-into-folio_add_file_rmap_.patch mm-memory-page_add_file_rmap-folio_add_file_rmap_.patch mm-huge_memory-page_add_file_rmap-folio_add_file_rmap_pmd.patch mm-migrate-page_add_file_rmap-folio_add_file_rmap_pte.patch mm-userfaultfd-page_add_file_rmap-folio_add_file_rmap_pte.patch mm-rmap-remove-page_add_file_rmap.patch mm-rmap-factor-out-adding-folio-mappings-into-__folio_add_rmap.patch mm-rmap-introduce-folio_add_anon_rmap_.patch mm-huge_memory-batch-rmap-operations-in-__split_huge_pmd_locked.patch mm-huge_memory-page_add_anon_rmap-folio_add_anon_rmap_pmd.patch mm-migrate-page_add_anon_rmap-folio_add_anon_rmap_pte.patch mm-ksm-page_add_anon_rmap-folio_add_anon_rmap_pte.patch mm-swapfile-page_add_anon_rmap-folio_add_anon_rmap_pte.patch mm-memory-page_add_anon_rmap-folio_add_anon_rmap_pte.patch mm-rmap-remove-page_add_anon_rmap.patch mm-rmap-remove-rmap_compound.patch mm-rmap-introduce-folio_remove_rmap_.patch kernel-events-uprobes-page_remove_rmap-folio_remove_rmap_pte.patch mm-huge_memory-page_remove_rmap-folio_remove_rmap_pmd.patch mm-khugepaged-page_remove_rmap-folio_remove_rmap_pte.patch mm-ksm-page_remove_rmap-folio_remove_rmap_pte.patch mm-memory-page_remove_rmap-folio_remove_rmap_pte.patch mm-migrate_device-page_remove_rmap-folio_remove_rmap_pte.patch mm-rmap-page_remove_rmap-folio_remove_rmap_pte.patch documentation-stop-referring-to-page_remove_rmap.patch mm-rmap-remove-page_remove_rmap.patch mm-rmap-convert-page_dup_file_rmap-to-folio_dup_file_rmap_.patch mm-rmap-introduce-folio_try_dup_anon_rmap_.patch mm-huge_memory-page_try_dup_anon_rmap-folio_try_dup_anon_rmap_pmd.patch mm-memory-page_try_dup_anon_rmap-folio_try_dup_anon_rmap_pte.patch mm-rmap-remove-page_try_dup_anon_rmap.patch mm-convert-page_try_share_anon_rmap-to-folio_try_share_anon_rmap_.patch mm-rmap-rename-compound_mapped-to-entirely_mapped.patch mm-remove-one-last-reference-to-page_add__rmap.patch