PCIe点对点直传重构:TLP属性如何改写内核路由判定

NVMe SSD 的数据不经过内存、直接写进 RDMA 网卡或 GPU 显存,这条路径叫 P2PDMA(Peer-to-Peer DMA)。听起来简单,真正落到 PCIe 拓扑里就绕不开一个拦截者:ACS(Access Control Services)。Switch 端口一旦开了请求重定向或完成重定向,所有点对点事务都会被强制上报到 Root Complex,直通路径直接作废。

Mellanox/NVIDIA 的工程师 Leon Romanovsky 等人提交了一组 18 个补丁,对 Linux 内核的 P2PDMA 路由判定做了一次系统性重构。这组补丁的核心动作是:把「PCIe 拓扑判定」和「TLP 事务属性」彻底解耦,路由结果不再是一个值,而是按事务类别分别计算。

旧代码的三个想当然

重构前的 pci_p2pdma_map_type() 有个隐含假设:所有 P2P 事务都是强顺序、未翻译地址的。这个假设在三种场景下会出错。

第一种,Relaxed Ordering。规范明确写了:带 RO 属性的 Completion 事务不受 Completion Redirect 拦截。旧代码不管这个,一律按会被拦截算。

第二种,ATS 翻译地址。Switch 端口开了 Direct Translated P2P(DT)后,携带翻译地址的 Request 可以豁免请求重定向和出口控制。同样被旧代码无视。

第三种,Translation Blocking。开了 TB 的端口会直接拒绝翻译请求,这个分支旧代码根本没有。

结果就是「本来能直通的流量被判成必须绕行 Host Bridge」,延迟和带宽白白搭进去。更麻烦的是 dma-buf 导入端:内存提供方的拓扑信息封在导出者的私有数据里,RDMA 网卡或 GPU 驱动在下发 DMA 描述符前,压根不知道对端的 ACS 状态。mlx5_ib 驱动甚至写死了一套「推测矩阵」——用户一申请宽松排序就盲目开 ATS,在某些本可直通的场景里把物理总线地址当成翻译地址用,传输直接失败。

四类事务,一次算齐

新设计的做法是把 TLP 拆成四个组合类别:用「地址是否已翻译」和「完成包是否宽松排序」两个标志位组合出四种 Class。遍历 PCIe 拓扑树找分叉点时,不再只算一种映射类型,而是一次性算出四种 Class 各自的结果——走总线地址直通、绕 Host Bridge、还是不支持。

算完的四个结果被压缩打包进一个 unsigned long(每类占 4 bit),存进 XArray 缓存。后续同路径的查询直接读缓存,省掉重复遍历拓扑树的开销。对路由判定这种高频操作,这个缓存设计比表面看起来重要得多。

另一层解耦在 dma-buf 框架:dma_buf_ops 新增了可选回调,允许导出者把底层的 p2pdma_provider 暴露出来;导入者通过 dma_buf_p2pdma_map_type() 传入 TLP 标志位,直接查询当前链路的路由类型。mlx5 驱动据此重写了决策逻辑——默认配置下已经能直通就坚决不开 ATS;只有当「开 ATS 加宽松排序」确实能把路由从绕行变成直通时,才开启 ATS。盲猜时代结束。

不插硬件怎么测

ACS 控制位有 RR、CR、EC、DT、TB 五种,再乘上事务方向和拓扑层级,组合数在真实硬件上几乎不可能穷举。这组补丁用 KUnit 搭了一套零硬件依赖的仿真测试:在内存里构造一棵四层双设备的 PCIe 树——Root Port、Switch 上行口、两个下行口各挂一个嵌套 Switch,再接 Provider 和 Client 两个终端设备,然后用钩子拦截配置空间读写,注入任意 ACS 状态。

表驱动的用例矩阵覆盖了关键分支:开 DT 且带翻译标志时应豁免 RR 返回直通;开 TB 时翻译请求必须被阻断;带宽松排序的完成包应忽略 CR。还有两个容易漏的边界——非对称配置(只在 Client 侧开 CR、Provider 侧开 RR)下正向传输不能被误拦;配置空间读取失败时要安全地返回「不支持」而不是带着脏数据继续。

上生产前的两件事

动手验证拓扑时,lspci -vv 是第一入口:看每个 Switch 端口的 ACSCap 和 ACSCtl 字段,确认 RR/CR/EC/DT/TB 的实际开关状态,再对照 pci_p2pdma_map_type() 的预期路径。很多「P2P 跑不通」的问题,最后都是某一层交换机默认开了重定向。

另有一个认知要纠正:「开了 ACS 就一定走 Root Complex」并不成立。宽松排序的完成包和带翻译地址的请求都有规范豁免通道,这正是这次重构的立论基础。还要留意部署环境——云主机里 ACS 行为通常由 Hypervisor 决定,且常常不可控,把 P2PDMA 方案直接搬上虚拟机前先实测,别拿物理机的结论外推。

从演进脉络看,P2PDMA 框架自内核 5.x 引入以来一直按「能用」的方向补丁式生长,这次是第一次把路由判定拉回到严格对照 PCIe 规范的层面。对做 GPU 直通存储、RDMA 加速这类系统的团队,这组补丁值得跟进合入节奏。

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?