linux中的HMM vs drm_pagemap 对比分析

张开发
2026/4/23 21:04:07 15 分钟阅读

分享文章

linux中的HMM vs drm_pagemap 对比分析
1. 定位与层次关系两者不是替代关系而是层次关系drm_pagemap建立在 HMM 基础设施之上。┌─────────────────────────────────────────────────┐ │ DRM GPU SVM (drm_gpusvm) │ ← 用 hmm_range_fault() mmu_interval_notifier │ (GPU 页表填充、地址空间追踪) │ ├─────────────────────────────────────────────────┤ │ drm_pagemap │ ← 用 migrate_vma_* / migrate_device_* │ (设备内存分配、迁移抽象、DMA 映射) │ ├─────────────────────────────────────────────────┤ │ HMM 核心 (mm/hmm.c) │ │ hmm_range_fault(), mmu_interval_notifier │ ├─────────────────────────────────────────────────┤ │ migrate_vma / dev_pagemap / ZONE_DEVICE │ ← 内核基础设施 └─────────────────────────────────────────────────┘2. 功能对比维度HMM (include/linux/hmm.h)drm_pagemap (include/drm/drm_pagemap.h)所属子系统mm内存管理核心drmGPU 驱动框架主要功能将 CPU 页表状态镜像到设备管理设备内存分配与迁移核心 APIhmm_range_fault()drm_pagemap_migrate_to_devmem()/drm_pagemap_evict_to_ram()谁调用设备驱动直接或通过 drm_gpusvmdrm_gpusvm 或 GPU 驱动CPU 页表追踪mmu_interval_notifier回调不提供由上层 drm_gpusvm 负责内存迁移提供底层migrate_vma_*框架封装migrate_vma_*加入 DMA 映射和驱动回调设备内存管理dev_pagemap ZONE_DEVICE原语封装dev_pagemap增加引用计数、zdd、cache/shrinkerP2P 支持无直接 P2Pdrm_pagemap_ops.device_map/unmap interconnect protocol抽象层级通用、硬件无关DRM/GPU 特化3. 关键设计差异3.1 页表镜像 vs 内存放置HMM解决的核心问题是页表镜像设备如何知道进程虚拟地址 X 对应哪个物理页以及该映射何时失效。hmm_range_fault()将 CPU PTE 批量翻译为设备可用的 PFN 数组。drm_pagemap解决的核心问题是内存放置数据应该存放在系统内存还是设备内存以及如何安全地在两者之间搬移数据。3.2 对迁移的封装程度HMM 的migrate_vma_*是裸 API驱动需要自己处理// test_hmm.c 中的典型模式约 50 行代码migrate_vma_setup(args);// 手动分配目标页面// 手动拷贝数据// 手动设置 zone_device_datamigrate_vma_pages(args);migrate_vma_finalize(args);drm_pagemap 将这些封装成单次调用内部处理// GPU 驱动只需提供 ops 回调drm_pagemap_migrate_to_devmem(devmem_allocation,mm,start,end,mdetails);封装的内容包括自动管理 zddzone device data的引用计数自动处理 DMA 映射/解映射自动处理 P2P 迁移设备间直接搬移内置 timeslice 防止迁移活锁内置 retry 机制3.3 设备间互操作HMMdev_private_owner仅区分是不是我的页面跨设备访问时必须先迁回系统再迁到另一设备。drm_pagemap通过drm_interconnect_protocol和device_map/unmap回调支持设备间直接 DMAP2P并通过source_peer_migrates标志控制谁负责跨设备拷贝。3.4 生命周期管理HMM无内存管理策略页面何时迁移完全由驱动决定。drm_pagemaptimeslice_expiration页面在设备上的最低驻留时间防止 CPU fault 立即迁回drm_pagemap_cache shrinker内存压力时自动回收设备内存引用计数kref管理drm_pagemap生命周期devmem_allocation的detachedcompletion 处理设备解绑4. 核心 API 对比HMM 核心 APIAPI作用hmm_range_fault()将 CPU 页表翻译为设备 PFN 数组可选触发缺页mmu_interval_notifier监听 CPU 页表变化通知设备失效映射migrate_vma_setup/pages/finalize()VMA 级别页面迁移migrate_device_range/pages/finalize()设备级别页面迁移不需 mmap lockmake_device_exclusive()页面独占访问drm_pagemap 核心 APIAPI作用drm_pagemap_migrate_to_devmem()将系统/一致性内存迁移到设备内存drm_pagemap_evict_to_ram()将设备内存驱逐回系统内存不需 mmap lockdrm_pagemap_populate_mm()用设备内存填充 mm 地址范围drm_pagemap_ops.device_map/unmapP2P 设备间 DMA 映射drm_pagemap_devmem_ops.copy_to_devmem/copy_to_ram驱动实现的数据拷贝回调5. 驱动接入方式对比使用裸 HMM如 test_hmm.c驱动需要自行实现注册mmu_interval_notifier处理失效回调调用hmm_range_fault()获取 PFN处理重试逻辑分配 ZONE_DEVICE 页面管理空闲链表实现dev_pagemap_opsfolio_free, migrate_to_ram手动调用migrate_vma_*系列 API手动管理zone_device_data指针使用 drm_pagemap如 Intel Xe 驱动驱动只需提供drm_pagemap_devmem_opspopulate_devmem_pfn、copy_to_devmem、copy_to_ramdrm_pagemap_opsdevice_map、device_unmap可选P2P 用调用drm_pagemap_migrate_to_devmem()/drm_pagemap_evict_to_ram()其余的 mmu_notifier、迁移状态机、DMA 映射、引用计数等由框架处理。6. 总结HMMdrm_pagemap角色内核基础设施“砖块”GPU 驱动框架“房子”设计哲学通用、最小化、机制不策略GPU 专用、策略丰富、生产级直接使用者任意设备驱动、test_hmmDRM GPU 驱动Xe 等关联drm_pagemap 的底层依赖HMM 的上层消费者HMM 是内核提供的通用异构内存原语drm_pagemap 是 DRM 子系统基于 HMM 构建的 GPU 设备内存管理框架。test_hmm.c直接使用裸 HMM API 进行测试而真实 GPU 驱动如 Intel Xe通过 drm_pagemap 间接使用 HMM。

更多文章