第十章 GPU 虚拟地址空间管理:10.6 页表更新与 TLB 失效
前两篇处理的是框架视图与 BO 集合,页表本身不在 drm_gpuvm 的范围之内。框架不规定页表格式,不分配页表内存,也不发起 TLB 失效,这些工作全部由驱动完成。驱动的实现差别很大,但都要解决四个问题:
- 页表内存在何时分配;
- 在 GPU 可能并发访问的情况下如何写入;
- 映射变更后如何按正确的顺序失效 TLB;
- 以及页表本身何时可以释放。
本篇以 Xe、panthor、nouveau 等驱动为例说明这四个问题的处理方式。
1. 页表的实现方式
1.1 驱动的选择
GPU 页表的格式由硬件决定。
- 集成在 SoC 中的 GPU 往往复用 CPU 侧 IOMMU 的页表格式,驱动可以直接使用内核的 io-pgtable 库;
- 独立 GPU 的页表格式通常是专有的,驱动需要自行实现页表的遍历与写入。写入方同样有两种:由 CPU 直接写页表内存,或由 GPU 的复制引擎以作业的形式写入。各驱动的选择如表 10.6.1 所示。
| 驱动 | 页表存储 | 写入方 | TLB 失效方式 |
|---|---|---|---|
| Xe | 页表 BO,与 VM 共用 resv | m |