v9
2026-11-06
匿名THP的PMD级swap条目 · v9
为多架构添加 PMD swap-exclusive 助手,并让 softleaf 层识别 PMD swap 项。
原始补丁链接
子 Patch(32)
1/32
mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio()
将pmd_to_softleaf_folio()重命名为pmd_softleaf_to_folio(),澄清其语义是解码PMD中的softleaf并返回对应folio,纯命名清理无功能变化。
2/32
arm64: mm: add PMD swap-exclusive helpers
arm64新增PMD swap-exclusive辅助,复用PTE_SWP_EXCLUSIVE,让PG_anon_exclusive存于swap PMD,为匿名THP跨swap保持PMD映射铺路。
3/32
loongarch: mm: add PMD swap-exclusive helpers
LoongArch新增PMD swap-exclusive辅助;swap PMD为swap PTE加_PAGE_HUGE,_PAGE_SWP_EXCLUSIVE位于type/offset之外,可直接复用该位。
4/32
powerpc: mm: add PMD swap-exclusive helpers
book3s64新增PMD swap-exclusive辅助,包装PTE实现并复用_PAGE_SWP_EXCLUSIVE;仅PPC_THP启用ARCH_HAS_PMD_SOFTLEAVES,故只覆盖该变体。
5/32
riscv: mm: add PMD swap-exclusive helpers
riscv新增PMD swap-exclusive辅助,因swap PMD与swap PTE编码相同,直接包装PTE辅助并复用_PAGE_SWP_EXCLUSIVE,支撑THP跨swap保留独占态。
6/32
s390: mm: add PMD swap-exclusive helpers
s390的swap PMD是独立RSTE布局,不借用PTE格式宏,新增自有exclusive位并记录到RSTE swap布局第52位,供PMD级swap独占态使用。
7/32
x86: mm: add PMD swap-exclusive helpers
x86-64复用_PAGE_SWP_EXCLUSIVE位3实现PMD swap-exclusive;32位该位与_PAGE_PSE冲突,故断言不启用ARCH_HAS_PMD_SOFTLEAVES,防止swap PMD被pmd_present()。
8/32
mm: recognize PMD swap entries in the softleaf layer
softleaf层接受PMD swap条目并新增pmd_is_swap_entry();pmd_softleaf_to_folio()对无PFN条目告警返回NULL,softleaf_from_pmd()还需剥离exclusive覆盖位。
9/32
mm/debug_vm_pgtable: test PMD swap-exclusive helpers
debug_vm_pgtable新增PMD级swap-exclusive测试,镜像PTE测试并检查swap soft-dirty后PMD仍非present,及早发现独占位与type/offset重叠。
10/32
mm/migrate_device: avoid leaking folio references during THP splitting
migrate_vma_split_unmapped_folio()去掉额外folio_get(),改用迁移条目展开;避免MADV_DONTNEED竞态下PMD被清后拆分未执行,导致folio引用泄漏和-EAGAIN。
11/32
mm: make PMD migration-entry splitting explicit
将__split_huge_pmd()的freeze改名为to_migration_entries并私有化,新增split_pmd_to_migration_entries()供try_to_migrate_one();并断言仅present/device-private PMD可进入。
12/32
mm: split PMD swap entries into PTE swap entries
让__split_huge_pmd_locked()识别并拆分PMD swap条目为PTE swap条目,避免落入present路径对非present条目pmdp_invalidate()和pmd_page();swap条目无folio引用,无需计数。
13/32
mm/swap: allow duplicating a range of swap entries
把swap_dup_entry_direct()扩展为swap_dup_entries_direct(nr),重试分配也覆盖同范围;要求范围不跨swap cluster否则-EINVAL,旧单槽接口保留为内联包装。
14/32
mm: handle PMD swap entries in fork path
copy_huge_pmd()新增PMD swap分支,复制swap引用、清源exclusive、加入mmlist并计MM_SWAPENTS;GFP_ATOMIC分配失败返回-EIO,由copy_pmd_range()用GFP_KERNEL重试。
15/32
mm: swap: share swap-cache allocation error cleanup
在mm/swap_state.c中把swap cache插入后的两种分配失败清理合并为统一错误路径,移除swap cache、恢复shadow并丢folio引用,为后续检查复用。
16/32
mm: zswap: reject high-order swap cache allocations backed by zswap
__swap_cache_alloc()拒绝由zswap支撑的高阶swap cache分配;待folio入cache后检查状态稳定,避免zswap与后端混合时整块读回陈旧数据,调用者回退order-0。
17/32
mm: swap in PMD swap entries as whole THPs during swapoff
swapoff用unuse_pmd()/swap_pmd_cache_lookup()把PMD swap条目整体换入THP,保留softdirty、exclusive、UFFD;空或单folio才走PMD,拆散、zswap、poison或失败回退PTE并重验PMD。
18/32
fs/proc: account PMD swap entries in smaps
smaps_pmd_entry()处理PMD swap条目:SwapPss逐slot统计,非驻留故不计AnonHugePages/Rss;同时将device-private PMD视为fake-present以走mapcount型PSS和私有/共享统计。
19/32
mm: handle soft-dirty and uffd-wp on PMD swap entries
软脏和uffd-wp存于PMD,需在PMD swap条目上同样处理;change_huge_pmd()去掉thp_migration_supported()门控,使change_non_present_huge_pmd()默认分支只更新uffd-wp。
20/32
mm/hmm: fault PMD swap entries on demand
hmm_vma_handle_absent_pmd()把PMD swap条目当作PTE swap处理:有fault请求则记录fault,否则报告非驻留无标志,而不是返回HMM_PFN_ERROR导致永久失败。
21/32
mm: free PMD swap entries in zap_huge_pmd()
zap_huge_pmd()在folio查找前识别PMD swap条目并释放其swap槽,避免normal_or_softleaf_folio_pmd()告警,也避免unmap已换出THP时泄漏整PMD的swap计数。
22/32
mm/madvise: free PMD swap entries with MADV_FREE
MADV_FREE处理PMD swap条目:覆盖整个PMD时直接整块释放,覆盖子范围时拆成PTE后由现有PTE路径释放,避免对换出THP静默无操作。
23/32
mm/madvise: skip PMD swap entries for MADV_COLD and MADV_PAGEOUT
MADV_COLD/PAGEOUT遇到PMD swap条目直接跳过,因无驻留folio;并在持PMD锁后重检,避免无锁时pmd_trans_huge()为假而误走PTE表路径触发VM_WARN_ON_ONCE。
24/32
mm/madvise: keep PMD swap entries whole for MADV_GUARD_INSTALL/REMOVE
MADV_GUARD_INSTALL/REMOVE在回调中同时识别PMD swap条目并整体消费,避免bare pmd_trans_huge()为假导致walk_pmd_range()拆分,随后PTE回调发现已填充而中止。
25/32
mm/mincore: report PMD swap-cache residency
mincore_pte_range()对PMD swap条目从swap cache判断驻留:空则全不驻留,单个uptodate PMD folio则全驻留,已拆分则逐slot回退查询,避免把待换入页误报为resident。
26/32
mm/khugepaged: treat PMD swap entries as mapped THPs
check_pmd_state()在pmd_present()/pmd_bad()前把PMD swap条目判为SCAN_PMD_MAPPED,视为已映射THP;MADV_COLLAPSE因此直接成功返回,不在调用中换入,只推迟到首次缺页。
27/32
mm: handle PMD swap entries in MADV_WILLNEED
MADV_WILLNEED对PMD swap条目预读整块PMD-order folio并保留条目,先检查THP策略;缓存拆散、zswap、分配/读取失败则回退PTE,失败folio先从swap cache移除以免后续SIGBUS。
28/32
mm: handle PMD swap entries in UFFDIO_MOVE
UFFDIO_MOVE新增move_swap_pmd()仿move_swap_pte()搬移PMD swap条目,双锁下处理softdirty、UFFD、exclusive和页表;仅空cache或单个PMD folio整体移动,拆分则重试。
29/32
mm: don't PTE-batch a swap-in over a hardware-poisoned subpage
do_swap_page()的大folio PTE批量映射前检查所有子页PageHWPoison(),发现毒页则跳过批处理,让每页单独缺页,确保非首毒子页不被静默映射并触发SIGBUS。
30/32
mm: handle PMD swap entry faults on swap-in
新增do_huge_pmd_swap_page()在PMD粒度换入swap条目,恢复softdirty、uffd-wp和写权限且不做order-0预读;VMA不允许THP、cache拆散、zswap或分配/读/charge失败时拆分回退do_swap_page()。
31/32
mm: install PMD swap entries on swap-out
swap-out时已入swap cache的PMD可映射folio不再请求TTU_SPLIT_HUGE_PMD;try_to_unmap_one()新增PMD分支,用set_pmd_swap_entry()安装单个条目并转移swap引用、exclusive、dirty和mmlist。
32/32
selftests/mm: add PMD swap entry tests
selftests/mm新增PMD swap条目测试,fixture先MADV_PAGEOUT并回收,用mincore判断cache是否仍驻留;覆盖swapin、fork、write、munmap、mprotect、mremap、mincore、swapoff等并在条件不满足时skip。