v13 2026-08-04

设备页缺页时迁移 · v13

让 HMM 页表遍历支持设备页迁移,含 pfn 转换、folio 拆分、PTE/PMD 收集、懒 MMU 和回滚

原始补丁链接

子 Patch(11)

1/11
mm/Kconfig: changes for migrate on fault for device pages
Kconfig 中让 migrate_device 显式依赖 HMM/MMU notifier,统一 HMM/migrate_device 页表遍历需要 HMM 开启,避免随机配置被破坏。
2/11
mm: add helper to convert HMM pfn to migrate pfn
新增 HMM pfn 转 migrate pfn 的辅助函数,把 HMM 收集的 pfn 及标志转换为 migrate_vma 使用的迁移 pfn,供统一页表遍历后移交迁移层。
3/11
mm/hmm: preparations for HMM to participate in migration
让 hmm_range_fault() 在页表遍历中保存 vma 供迁移使用;迁移期间持 mmap_lock 并触发 mmu_notifier,统一 fault 与 migrate_vma 获取 mm_struct 的方式。
4/11
mm/hmm: do the plumbing for HMM to participate in migration
在 HMM 页表遍历回调中接入迁移收集流程:迁移时锁定 pmd/pte,调用 hmm_vma_handle_migrate_prepare()/pmd(),处理 fault 时再解锁,为真正迁移做铺垫。
5/11
mm/hmm: implement folio split for migrate needs in HMM pagewalk
实现页表遍历中 PMD 级大 folio 的拆分,用于地址未 PMD 对齐或设置 pmd 迁移项失败时,拆成小页后继续迁移。
6/11
mm/hmm: migrate collection in HMM pagewalk - pte level
从 migrate_vma_collect_pmd() 移植实现 hmm_vma_handle_migrate_prepare(),并新增 migrate_vma_split_folio() 拆分 PTE 映射大 folio,释放页表锁前先引用 folio。
7/11
mm/hmm: migrate collection in HMM pagewalk - pmd level
从 migrate_vma_collect_huge_pmd() 移植实现 hmm_vma_handle_migrate_prepare_pmd(),负责 pmd 级迁移决策、拆 folio 及插入 pmd/pte 迁移项。
8/11
mm/hmm: add lazy MMU mode support for migration in HMM pagewalk
在 HMM 迁移页表遍历期间调用 lazy_mmu_mode_enable()/lazy_mmu_mode_disable(),开启 lazy MMU 模式批量处理 TLB,降低迁移开销。
9/11
mm/hmm: implement rollback for device page migration in HMM pagewalk
实现 HMM 页表迁移收集的回滚:检测到丢锁后 PTE 表被清空/替换时,撤销已置 HMM_PFN_MIGRATE 的项,解锁 folio 并放引用,迁移 pte 跳过以便重启遍历。
10/11
mm: enable device page migration from HMM pagewalk
启用 HMM 页表遍历完成设备页迁移:hmm_range_fault() 参与迁移,migrate_vma_setup() 改走 HMM 路径,新增 MIGRATE_VMA_FAULT/WRITE 标志,删除旧 migrate_vma_collect*() 代码。
11/11
lib/test_hmm: add a new testcase for the migrate on fault
为 lib/test_hmm 增加 migrate-on-fault 测试用例,覆盖 HMM 页表遍历在缺页时发起设备页迁移的路径。