Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/khugepaged: unify pmd folio installation with map_anon_folio_pmd()

Currently we install pmd folio with map_anon_folio_pmd() in
__do_huge_pmd_anonymous_page() and do_huge_zero_wp_pmd(). While in
collapse_huge_page(), it is done with identical code except statistics
adjustment.

Unify the process with map_anon_folio_pmd() to install pmd folio. Split
it to map_anon_folio_pmd_pf() and map_anon_folio_pmd_nopf() to be used in
page fault or not respectively.

No functional change is intended.

[akpm@linux-foundation.org: remove unneeded map_anon_folio_pmd_nopf() stub, per Wei & David]
Link: https://lkml.kernel.org/r/20251008095453.18772-3-richard.weiyang@gmail.com
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Zi Yan <ziy@nvidia.com>
Acked-by: Lance Yang <lance.yang@linux.dev>
Cc: David Hildenbrand <david@redhat.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Usama Arif <usamaarif642@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Wei Yang and committed by
Andrew Morton
ac775677 2a1351cd

+13 -12
+2
include/linux/huge_mm.h
··· 533 533 pmd_t *pmd, bool freeze); 534 534 bool unmap_huge_pmd_locked(struct vm_area_struct *vma, unsigned long addr, 535 535 pmd_t *pmdp, struct folio *folio); 536 + void map_anon_folio_pmd_nopf(struct folio *folio, pmd_t *pmd, 537 + struct vm_area_struct *vma, unsigned long haddr); 536 538 537 539 #else /* CONFIG_TRANSPARENT_HUGEPAGE */ 538 540
+10 -4
mm/huge_memory.c
··· 1218 1218 return folio; 1219 1219 } 1220 1220 1221 - static void map_anon_folio_pmd(struct folio *folio, pmd_t *pmd, 1221 + void map_anon_folio_pmd_nopf(struct folio *folio, pmd_t *pmd, 1222 1222 struct vm_area_struct *vma, unsigned long haddr) 1223 1223 { 1224 1224 pmd_t entry; ··· 1229 1229 folio_add_lru_vma(folio, vma); 1230 1230 set_pmd_at(vma->vm_mm, haddr, pmd, entry); 1231 1231 update_mmu_cache_pmd(vma, haddr, pmd); 1232 + deferred_split_folio(folio, false); 1233 + } 1234 + 1235 + static void map_anon_folio_pmd_pf(struct folio *folio, pmd_t *pmd, 1236 + struct vm_area_struct *vma, unsigned long haddr) 1237 + { 1238 + map_anon_folio_pmd_nopf(folio, pmd, vma, haddr); 1232 1239 add_mm_counter(vma->vm_mm, MM_ANONPAGES, HPAGE_PMD_NR); 1233 1240 count_vm_event(THP_FAULT_ALLOC); 1234 1241 count_mthp_stat(HPAGE_PMD_ORDER, MTHP_STAT_ANON_FAULT_ALLOC); 1235 1242 count_memcg_event_mm(vma->vm_mm, THP_FAULT_ALLOC); 1236 - deferred_split_folio(folio, false); 1237 1243 } 1238 1244 1239 1245 static vm_fault_t __do_huge_pmd_anonymous_page(struct vm_fault *vmf) ··· 1278 1272 return ret; 1279 1273 } 1280 1274 pgtable_trans_huge_deposit(vma->vm_mm, vmf->pmd, pgtable); 1281 - map_anon_folio_pmd(folio, vmf->pmd, vma, haddr); 1275 + map_anon_folio_pmd_pf(folio, vmf->pmd, vma, haddr); 1282 1276 mm_inc_nr_ptes(vma->vm_mm); 1283 1277 spin_unlock(vmf->ptl); 1284 1278 } ··· 1950 1944 if (ret) 1951 1945 goto release; 1952 1946 (void)pmdp_huge_clear_flush(vma, haddr, vmf->pmd); 1953 - map_anon_folio_pmd(folio, vmf->pmd, vma, haddr); 1947 + map_anon_folio_pmd_pf(folio, vmf->pmd, vma, haddr); 1954 1948 goto unlock; 1955 1949 release: 1956 1950 folio_put(folio);
+1 -8
mm/khugepaged.c
··· 1226 1226 __folio_mark_uptodate(folio); 1227 1227 pgtable = pmd_pgtable(_pmd); 1228 1228 1229 - _pmd = folio_mk_pmd(folio, vma->vm_page_prot); 1230 - _pmd = maybe_pmd_mkwrite(pmd_mkdirty(_pmd), vma); 1231 - 1232 1229 spin_lock(pmd_ptl); 1233 1230 BUG_ON(!pmd_none(*pmd)); 1234 - folio_add_new_anon_rmap(folio, vma, address, RMAP_EXCLUSIVE); 1235 - folio_add_lru_vma(folio, vma); 1236 1231 pgtable_trans_huge_deposit(mm, pmd, pgtable); 1237 - set_pmd_at(mm, address, pmd, _pmd); 1238 - update_mmu_cache_pmd(vma, address, pmd); 1239 - deferred_split_folio(folio, false); 1232 + map_anon_folio_pmd_nopf(folio, pmd, vma, address); 1240 1233 spin_unlock(pmd_ptl); 1241 1234 1242 1235 folio = NULL;