v5 2026-09-15

拆分 folio 的 anon/file 辅助函数解耦 · v5

重构huge_memory大页拆分:修正swap cache检查,分离anon/file路径,整理锁与remap引用计数。

原始补丁链接

子 Patch(17)

1/17
mm/swap: fix off-by-one in swap cache replace sanity check
修正 __swap_cache_replace_folio 的 DEBUG_VM 校验:原 while(ci_off++<ci_end) 先自增导致跳过首项并越界读;改用与替换循环一致的 do-while,避免非均匀 split 误报。
2/17
mm/huge_memory: fix rejection of swap cache folios with a mapping
将 shmem 交换缓存 folio 不可 split 的检查提前到 folio_check_splittable 并返回 -EBUSY,避免原防御路径在冻结 ref、扣减 THP 计数后失败,导致 folio 冻结、计数失真和误警告。
3/17
mm/huge_memory: invert folio_ref_freeze() check to reduce indentation
在 __folio_freeze_and_split_unmapped() 中把 folio_ref_freeze() 失败改为早返回,减少成功路径缩进;纯重构无功能变化,为后续拆分匿名与文件助手做准备。
4/17
mm/huge_memory: split the routine for splitting anon and file folio
把 __folio_freeze_and_split_unmapped() 拆成匿名与文件两个 split 路径;zone_device_private_split_cb 仅保留在匿名路径,文件入口加 VM_WARN_ON_ONCE_FOLIO,便于独立演化并去掉冗余检查。
5/17
mm/huge_memory: rename __split_unmapped_folio() to __split_frozen_folio()
将 __split_unmapped_folio() 重命名为 __split_frozen_folio(),强调其要求 folio refcount 已冻结;并加 VM_WARN_ON_ONCE_FOLIO(folio_mapped()) 自证冻结时必未映射,避免误用。
6/17
mm/huge_memory: consolidate irq and locking for folio split
让匿名/文件 split helper 各自管理 irq 与锁,__folio_split 去掉本地 irq 和 fail 标签;文件路径改用 xas_lock_irq(),与 mm 中冻结 page cache folio 的加锁一致,并删无用的 xas_reset()。
7/17
mm/huge_memory: move EOF trimming into the file split helper
把 EOF 边界计算与超出页裁剪移入文件 split helper,不再让调用者传 end/nr_shmem_dropped;仅文件拆分需要该逻辑,因此删除冗余参数与校验。
8/17
mm/huge_memory: move unmap and remap into the split helpers
将 unmap/remap 处理从 __folio_split() 下移到匿名/文件 split helper;只有匿名拆分需要 remap_page(),故删除其中冗余的匿名判断。
9/17
mm/huge_memory: rename remap_page() to remap_anon_folio()
LGTM. Reviewed-by: Yeoreum Yun yeoreum.yun@arm.com > From: Kairui Song kasong@tencent.com > > remap_page() now only has one caller, __folio_freeze_split_anon(), > and is only ever called for ano
10/17
mm/huge_memory: move the racy refcount check into unmap_folio()
Reviewed-by: Yeoreum Yun yeoreum.yun@arm.com On Tue, Sep 15, 2026 at 01:14:51AM +0800, Kairui Song via B4 Relay wrote: > From: Kairui Song kasong@tencent.com > > The check only exists to avoid t
11/17
mm/huge_memory: move filemap management into the file split helper
Reviewed-by: Yeoreum Yun yeoreum.yun@arm.com On Tue, Sep 15, 2026 at 01:14:52AM +0800, Kairui Song via B4 Relay wrote: > From: Kairui Song kasong@tencent.com > > Only file split needs the filema
12/17
mm/huge_memory: move anon_vma handling into the anon split helper
[mm/huge_memory: move anon_vma handling into the anon split helper] From: Kairui Song kasong@tencent.com Only anon split needs the anon_vma, and it only needs it to unmap and remap. Move the folio
13/17
mm/huge_memory: move memcg switch into the file split helper
把 memcg 切换移入 __folio_freeze_split_file(),使其中 xarray 节点分配计入 folio 所属 memcg;匿名拆分和拆分后释放无可计费分配,__folio_split() 的 out_no_memcg 标签简化为 out。
14/17
mm/huge_memory: drop the unused do_lru argument of the file split helper
From: Kairui Song kasong@tencent.com The only caller of __folio_freeze_split_file() always passes do_lru as true, so the argument and the branches gated on it are dead code. Drop it. Reviewed-by:
15/17
mm/huge_memory: clean up after-split folio freeing in __folio_split
拆分后循环改为显式 folio_free_swap()/folio_put();子 folio 仍锁定,可在未映射时直接释放 swap cache,避免 free_folio_and_swap_cache() trylock 失败后残留条目并明确引用释放。
16/17
mm/huge_memory: count only swap cache refs in anon folio split
From: Kairui Song kasong@tencent.com Only __folio_freeze_split_anon() sees anon folios and swap cache folios now. The file split helper only handles page cache folios, which hold exactly folio_nr_p
17/17
mm/huge_memory: drop the redundant mapping argument of __split_frozen_folio
删除 __split_frozen_folio() 的 mapping 参数,改用 xas 指针判断是否需更新 page cache:匿名传 NULL、文件传 &xas,语义相同并删除 kerneldoc。