The patch titled Subject: mm/rmap: introduce and use hugetlb_add_file_rmap() has been added to the -mm mm-unstable branch. Its filename is mm-rmap-introduce-and-use-hugetlb_add_file_rmap.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-rmap-introduce-and-use-hugetlb_add_file_rmap.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/rmap: introduce and use hugetlb_add_file_rmap() Date: Wed, 20 Dec 2023 23:44:27 +0100 hugetlb rmap handling differs quite a lot from "ordinary" rmap code. For example, hugetlb currently only supports entire mappings, and treats any mapping as mapped using a single "logical PTE". Let's move it out of the way so we can overhaul our "ordinary" rmap. implementation/interface. Right now we're using page_dup_file_rmap() in some cases where "ordinary" rmap code would have used page_add_file_rmap(). So let's introduce and use hugetlb_add_file_rmap() instead. We won't be adding a "hugetlb_dup_file_rmap()" functon for the fork() case, as it would be doing the same: "dup" is just an optimization for "add". What remains is a single page_dup_file_rmap() call in fork() code. Add sanity checks that we end up with the right folios in the right functions. Link: https://lkml.kernel.org/r/20231220224504.646757-4-david@xxxxxxxxxx Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Reviewed-by: Yin Fengwei <fengwei.yin@xxxxxxxxx> Reviewed-by: Ryan Roberts <ryan.roberts@xxxxxxx> Reviewed-by: Muchun Song <songmuchun@xxxxxxxxxxxxx> Cc: Hugh Dickins <hughd@xxxxxxxxxx> Cc: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Cc: Muchun Song <muchun.song@xxxxxxxxx> Cc: Peter Xu <peterx@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/rmap.h | 8 ++++++++ mm/hugetlb.c | 6 +++--- mm/migrate.c | 2 +- mm/rmap.c | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) --- a/include/linux/rmap.h~mm-rmap-introduce-and-use-hugetlb_add_file_rmap +++ a/include/linux/rmap.h @@ -211,6 +211,14 @@ void hugetlb_add_anon_rmap(struct folio void hugetlb_add_new_anon_rmap(struct folio *, struct vm_area_struct *, unsigned long address); +static inline void hugetlb_add_file_rmap(struct folio *folio) +{ + VM_WARN_ON_FOLIO(!folio_test_hugetlb(folio), folio); + VM_WARN_ON_FOLIO(folio_test_anon(folio), folio); + + atomic_inc(&folio->_entire_mapcount); +} + static inline void hugetlb_remove_rmap(struct folio *folio) { VM_WARN_ON_FOLIO(!folio_test_hugetlb(folio), folio); --- a/mm/hugetlb.c~mm-rmap-introduce-and-use-hugetlb_add_file_rmap +++ a/mm/hugetlb.c @@ -5408,7 +5408,7 @@ again: * sleep during the process. */ if (!folio_test_anon(pte_folio)) { - page_dup_file_rmap(&pte_folio->page, true); + hugetlb_add_file_rmap(pte_folio); } else if (page_try_dup_anon_rmap(&pte_folio->page, true, src_vma)) { pte_t src_pte_old = entry; @@ -6279,7 +6279,7 @@ static vm_fault_t hugetlb_no_page(struct if (anon_rmap) hugetlb_add_new_anon_rmap(folio, vma, haddr); else - page_dup_file_rmap(&folio->page, true); + hugetlb_add_file_rmap(folio); new_pte = make_huge_pte(vma, &folio->page, ((vma->vm_flags & VM_WRITE) && (vma->vm_flags & VM_SHARED))); /* @@ -6730,7 +6730,7 @@ int hugetlb_mfill_atomic_pte(pte_t *dst_ goto out_release_unlock; if (folio_in_pagecache) - page_dup_file_rmap(&folio->page, true); + hugetlb_add_file_rmap(folio); else hugetlb_add_new_anon_rmap(folio, dst_vma, dst_addr); --- a/mm/migrate.c~mm-rmap-introduce-and-use-hugetlb_add_file_rmap +++ a/mm/migrate.c @@ -252,7 +252,7 @@ static bool remove_migration_pte(struct hugetlb_add_anon_rmap(folio, vma, pvmw.address, rmap_flags); else - page_dup_file_rmap(new, true); + hugetlb_add_file_rmap(folio); set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte, psize); } else --- a/mm/rmap.c~mm-rmap-introduce-and-use-hugetlb_add_file_rmap +++ a/mm/rmap.c @@ -1395,6 +1395,7 @@ void folio_add_file_rmap_range(struct fo unsigned int nr_pmdmapped = 0, first; int nr = 0; + VM_WARN_ON_FOLIO(folio_test_hugetlb(folio), folio); VM_WARN_ON_FOLIO(compound && !folio_test_pmd_mappable(folio), folio); /* Is page being mapped by PTE? Is this its first map to be added? */ _ 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