ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Pathes解读:Linux 支持 device-private 内存的透明大页迁移(device-private THP)

Pathes解读:Linux 支持 device-private 内存的透明大页迁移(device-private THP) 1. 背景Linux 的 HMMHeterogeneous Memory Management与 zone device-private 内存机制允许把设备GPU 等加速器的私有内存以「不可被 CPU 直接访问的特殊页」形式纳入内核内存管理并在 CPU 系统内存与设备内存之间按需迁移页面。然而在本系列提交之前zone device-private 内存的迁移只支持PAGE_SIZE基础页粒度。这一限制带来两方面的直接代价其一以基础页为单位建立与拆除映射导致页表项数量庞大TLB 压力显著其二CPU 与设备内存之间的批量迁移被切分为大量单页操作迁移吞吐受限、延迟偏高。与此同时普通匿名内存早已具备透明大页THP能力而 device-private 内存无法享有同等的大页收益。随着 GPU 统一虚拟内存SVM等场景对大块内存迁移的需求增强弥合这一能力差距成为必要工作。该系列在 Ralph Campbell 早期工作的基础上继续推进目标是让 zone device-private 内存支持 THP 粒度的迁移与缺页处理并在设备侧无法分配大页时能够优雅回退到基础页。2. 作者与参与团队该补丁系列[v7 00/16] mm: support device-private THP由NVIDIA 的 Balbir Singh作为主要作者提交与维护工作延续自Ralph CampbellNVIDIA的早期原型。评审与协作在 linux-mm、dri-devel、linux-kernel 等社区展开核心参与者包括Andrew Mortonmm 子系统维护者负责将系列纳入 mm 树/linux-next 并推动合入协调修复补丁的合入顺序。Matthew BrostIntelXe 驱动 SVM 方向负责在真实 GPU 驱动上集成与压力测试报告了关键回归。Zi YanNVIDIATHP 拆分与 folio 语义评审推动unmapped拆分路径的重构。David HildenbrandRed Hat后为 Arm核心 mm 语义把关深度参与 s390 回归根因分析并对补丁的最小化与文档规范提出要求。Christian Borntraeger、Claudio ImbrendaIBMs390 与 KVM 方向定位并修复了该系列在 s390x 上暴露的 gmap 缺陷。Wei Yang、Lance Yang、Mika Penttilä、Francois Dugast等细节评审与测试反馈。3. 解决方案总体设计系列由 16 个补丁构成整体思路是在既有 zone device-private 基础设施上叠加 THP 感知能力而非另起炉灶并保证在大页不可用时无缝回退。其关键设计要点如下迁移接口引入两个新语义标志。在migrate_vma流程中新增MIGRATE_VMA_SELECT_COMPOUND选择并标记待迁移的 compound 页与MIGRATE_PFN_COMPOUND标记迁移条目为 compound。当调用方向migrate_vma_setup()传入MIGRATE_VMA_SELECT_COMPOUND时migrate_vma_setup()、migrate_vma_pages()、migrate_vma_finalize()全流程按大页迁移处理。源、目标大页能力不一致时支持中途拆分。当源侧可迁移大页、但目标侧例如设备无法分配大页源、目标在MIGRATE_PFN_COMPOUND上不一致时迁移过程可将 folio 在中途拆分为基础页继续完成避免整体迁移失败。全链路 THP 与 zone device 感知。PMD 操作、rmap、page vma walk、缺页处理等路径均被扩展为可识别并正确处理 large zone device-private folio 与其对应的非 present PMD 条目。4. 关键实现以下按功能域归纳系列中的核心改动大页 folio 基础设施mm/zone_device新增 large-order zone device folio 的分配例程与辅助函数用于判断 folio 是否为 device-private 并设置 zone device 私有数据。需要注意的是zone device-private 的 large folio 不支持普通 THP 的 deferred split / scan 机制。同时将 pgmap 的释放回调由page_free重命名为folio_free统一以 folio 为单位管理释放且对PAGE_SIZE与更高阶页均适用。PMD 操作与 rmap 扩展mm/huge_memory、mm/rmap为 PMD 级操作补充 device-private THP 支持并扩展 rmap 与迁移逻辑以处理 device-private 迁移条目。这一改动同时收紧了___pte_offset_map()对非 present PMD 的判定语义——正是该语义变化在 s390x 上暴露了既有缺陷见第六节。device-private THP 拆分与迁移mm/huge_memory、mm/migrate_device实现 device-private THP 的拆分、迁移过程中部分映射 folio 的收集处理以及 zone device 页的 THP 迁移。在需要拆分且页面已处于 unmapped迁移条目状态时早期实现通过在__folio_split()中散布unmapped分支来复用逻辑经 Zi Yan 与 Wei Yang 评审后重构为独立的folio_split_unmapped()辅助函数把「页面已解除映射、已从 LRU 隔离、拆分后保持锁定」这一特殊语义从主拆分路径中剥离降低了主路径的复杂度与锁定语义混淆。驱动侧拆分回调mm/memremap引入zone_device_private_split_cb()回调在 folio 拆分时通知驱动同步其私有元数据使设备驱动能够在核心 mm 拆分大页时维持自身状态一致。缺页处理mm/memory为 zone device-private 页新增 THP 级缺页处理路径。测试基础设施lib/test_hmm、selftests/mm/hmm-tests增强lib/test_hmm.c以支持 THP 迁移新增用于模拟大页分配失败的 ioctl从而可控地覆盖 folio 拆分回退路径hmm-tests.c增加了大页迁移、拆分路径、partial unmap / mremap / anon_write 等用例并新增吞吐量测试。驱动使能gpu/drm/nouveau让 nouveau dmem 代码使用新的 THP 迁移能力作为首个上游驱动示范。该系列在实现上对若干位置硬编码了HPAGE_PMD_NR但整体保持了阶数无关的通用结构为后续 mTHP多尺寸 THP扩展预留了空间。作者规划的 mTHP 后续方向包括在测试驱动中引入可允许 THP 阶数的概念、在非 PMD 路径中检测驱动支持的合适阶数、跨阶数迭代选择可迁移的最高阶并完成迁移。5. 最终效果与合入状态在作者基于lib/test_hmm的本地测试与吞吐量测试中该系列相较基础页粒度迁移带来了约350% 的数据传输吞吐提升与约80% 的延迟改善同时降低了页表开销、提升了内存带宽利用率并在大页不可用时可回退至基础页。合入状态方面经对内核树核对引入folio_split_unmapped()的提交cab812d9c964Balbir Singh2025-11-14可由v6.19-rc1包含git tag --contains显示其存在于v6.19及之后所有版本标签。因此该系列在v6.19 合并窗口进入 Linus 主线首次出现于 v6.19-rc1。相关符号MIGRATE_VMA_SELECT_COMPOUND、zone_device_private_split_cb、folio_split_unmapped均已存在于主线mm/huge_memory.c、mm/migrate_device.c与include/linux/之中。v7 系列封面00/16https://lore.kernel.org/lkml/20251001065707.920170-1-balbirsnvidia.com6. 评审中的关键问题与处置s390x KVM 回归Christian Borntraeger 报告补丁 03 在 linux-next 中导致 s390x KVM 客户机无法启动。David Hildenbrand、Balbir Singh 与 IBM 团队定位到根因该系列将___pte_offset_map()的判定从!pmd_present()收紧后暴露了 s390 gmap 既有问题——指向 pte 的普通 gmap pud/pmd 条目未设置 present 位与用户空间 pud 行为不一致。最终由 Claudio Imbrenda 提交独立修复KVM: s390: Fix missing present bit for gmap puds在__gmap_link()中补上_SEGMENT_ENTRY获得 Tested-by/Acked-by/Reviewed-by。Andrew Morton 按建议将该修复排在引入问题的补丁之前合入以保证 bisect 不被破坏。Xe SVM 回归Matthew Brost 报告在 Xe 驱动 SVM 压力测试中出现随机内核挂起表现为hmm_range_fault()阻塞于migration_entry_wait_on_locked()症状为迁移 PTE 被安装但未被清除且不启用 THP device page 亦可复现。Balbir 建议在含remove_migration_pmd()修复的 mm-unstable 上验证并提供可复现的 hmm-tests 用例该问题属于合入前后持续排查的稳定性事项。补丁最小化规范David HildenbrandArm在 2026-02 指出补丁 11 无缘由删除了__split_folio_to_order()中对 tail page-private的VM_WARN_ON_ONCE_PAGE防御性检查。Balbir 说明是测试中该值恒为 NULL 而移除并同意恢复David 强调补丁应仅做相关改动并记录原因将在后续-private改造中酌情加回该检查。7. 补丁清单与链接v7 系列共 16 个补丁均由 Balbir Singh 提交lore 归档链接如下#标题链接00mm: support device-private THP封面https://lore.kernel.org/lkml/20251001065707.920170-1-balbirsnvidia.com01mm/zone_device: support large zone device private folioshttps://lore.kernel.org/lkml/20251001065707.920170-2-balbirsnvidia.com02mm/zone_device: Rename page_free callback to folio_freehttps://lore.kernel.org/lkml/20251001065707.920170-3-balbirsnvidia.com03mm/huge_memory: add device-private THP support to PMD operationshttps://lore.kernel.org/lkml/20251001065707.920170-4-balbirsnvidia.com04mm/rmap: extend rmap and migration support device-private entrieshttps://lore.kernel.org/lkml/20251001065707.920170-5-balbirsnvidia.com05mm/huge_memory: implement device-private THP splittinghttps://lore.kernel.org/lkml/20251001065707.920170-6-balbirsnvidia.com06mm/migrate_device: handle partially mapped folios during collectionhttps://lore.kernel.org/lkml/20251001065707.920170-7-balbirsnvidia.com07mm/migrate_device: implement THP migration of zone device pageshttps://lore.kernel.org/lkml/20251001065707.920170-8-balbirsnvidia.com08mm/memory/fault: add THP fault handling for zone device private pageshttps://lore.kernel.org/lkml/20251001065707.920170-9-balbirsnvidia.com09lib/test_hmm: add zone device private THP test infrastructurehttps://lore.kernel.org/lkml/20251001065707.920170-10-balbirsnvidia.com10mm/memremap: add driver callback support for folio splittinghttps://lore.kernel.org/lkml/20251001065707.920170-11-balbirsnvidia.com11mm/migrate_device: add THP splitting during migrationhttps://lore.kernel.org/lkml/20251001065707.920170-12-balbirsnvidia.com12lib/test_hmm: add large page allocation failure testinghttps://lore.kernel.org/lkml/20251001065707.920170-13-balbirsnvidia.com13selftests/mm/hmm-tests: new tests for zone device THP migrationhttps://lore.kernel.org/lkml/20251001065707.920170-14-balbirsnvidia.com14selftests/mm/hmm-tests: partial unmap, mremap and anon_write testshttps://lore.kernel.org/lkml/20251001065707.920170-15-balbirsnvidia.com15selftests/mm/hmm-tests: new throughput tests including THPhttps://lore.kernel.org/lkml/20251001065707.920170-16-balbirsnvidia.com16gpu/drm/nouveau: enable THP support for GPU memory migrationhttps://lore.kernel.org/lkml/20251001065707.920170-17-balbirsnvidia.com相关联的独立修复与前置工作s390 修复KVM: s390: Fix missing present bit for gmap pudsClaudio Imbrendahttps://lore.kernel.org/lkml/20251017144924.10034-1-borntraegerlinux.ibm.com/Ralph Campbell 早期 THP 迁移原型参考 [1]https://lore.kernel.org/linux-mm/20201106005147.20113-1-rcampbellnvidia.com/HMM large folio 前置补丁mm/hmm: populate PFNs from PMD swap entrycommit10b9feee2d0d历史版本v1–v6封面链接v2https://lore.kernel.org/lkml/20250703233511.2028395-1-balbirsnvidia.com/v3https://lore.kernel.org/lkml/20250730092139.3890844-1-balbirsnvidia.com/v4https://lore.kernel.org/lkml/20250812024036.690064-1-balbirsnvidia.com/v5https://lore.kernel.org/lkml/20250903011900.3657435-1-balbirsnvidia.com/v6https://lore.kernel.org/lkml/20250916122128.2098535-1-balbirsnvidia.com/本文档基于邮件线程[v7 00/16] mm: support device-private THP2025-10 至 2026-02共 79 封邮件及工作区内核树的合入状态核对整理。
返回列表