SR-IOV、ATS、PRI、PASID 与 IOMMU 虚拟化

SR-IOV、ATS、PRI、PASID 与 IOMMU 虚拟化

1. 能力边界

这些机制解决的问题不同:

机制 作用
SR-IOV 一个 Physical Function 在硬件中创建多个 Virtual Function
ATS 设备缓存 IOMMU 地址翻译结果
PRI 设备遇到缺页时向系统发 Page Request
PASID 在同一 Requester ID 下区分多个进程地址空间
IOMMU 做 DMA 地址翻译、权限与隔离
VFIO 把隔离后的设备安全交给用户态/VMM

drivers/pci实现 PCI Capability 管理,不实现完整 IOMMU 或 VFIO;后两者分别位于drivers/iommudrivers/vfio

2. SR-IOV 数据模型

PF 的 SR-IOV Extended Capability 描述:

  • TotalVFs、InitialVFs、NumVFs;
  • First VF Offset 与 VF Stride;
  • VF Device ID;
  • VF BAR;
  • VF Enable、VF MSE、ARI 等控制位。

VF 的 BDF 由 PF Routing ID 加 offset/stride 计算。VF 是可匹配普通pci_driverpci_dev,但配置空间和资源由 PF/SR-IOV 能力约束。

3. 启用主链

iov.c关键入口:

  • pci_enable_sriov():1119 行;
  • sriov_enable():633 行;
  • pci_iov_add_virtfn():315 行;
  • pci_disable_sriov():1136 行;
  • sriov_disable():754 行。

流程可概括为:

1
2
3
4
5
6
7
8
PF driver 或 sysfs sriov_numvfs
-> 校验 PF 状态、VF 数量和驱动回调
-> 检查/分配 VF BAR
-> 写 NumVFs 与 VF Enable
-> 为每个 VF 计算 devfn
-> pci_iov_add_virtfn()
-> 创建 pci_dev 并加入设备模型
-> VF driver probe

禁用时必须先确认 VF 未被占用,再逆序移除 VF、关闭 VF Enable,并释放关联关系。

4. PF 驱动职责

硬件仅提供 VF 机制,PF 驱动仍要:

  • 实现sriov_configure或调用pci_enable_sriov()
  • 分配队列、doorbell、MSI-X 等共享资源;
  • 配置 VF MAC/VLAN/权限;
  • 提供 PF↔VF mailbox;
  • 在 remove、AER、suspend 前妥善关闭 VF。

PCI Core 不理解网卡或加速器的内部资源,因此“VF 已出现在 lspci”不等于 VF 可以正常收发。

5. VF BAR 与桥窗口

VF BAR 表示整组 VF aperture。固件未为其预留足够空间时,启用会失败。可检查:

  • PF SR-IOV Capability 中 VF BAR 大小;
  • Root Port/桥窗口;
  • 64 位 prefetchable window;
  • pci=realloc=onCONFIG_PCI_REALLOC_ENABLE_AUTO
  • BAR 是否被其它资源冲突占用。

6. ATS

ats.c中:

  • pci_enable_ats():56 行;
  • pci_disable_ats():94 行;
  • pci_restore_ats_state():109 行。

ATS 允许设备的 Address Translation Cache 保存 IOVA→PA 翻译。页大小参数必须与 IOMMU 支持一致。撤销映射时,IOMMU 和设备 ATC 必须完成失效同步,否则设备可能继续使用旧权限。

7. PRI

关键入口:

  • pci_enable_pri():196 行;
  • pci_disable_pri():242 行;
  • pci_reset_pri():295 行。

PRI 允许设备提交 Page Request,从而支持可缺页共享虚拟内存。启用前要求 IOMMU、设备和上层驱动都能处理请求队列、超时及终止,不能仅设置 Capability 位。

8. PASID

关键入口:

  • pci_enable_pasid():361 行;
  • pci_disable_pasid():407 行;
  • pci_pasid_features():460 行。

PASID 将进程/地址空间标签随事务携带。它与 SVA 的安全边界依赖 IOMMU:设备可发出的 PASID 范围、绑定生命周期和进程退出必须同步。

9. 安全顺序

设备直通或共享虚拟地址时应遵循:

1
2
3
4
5
6
7
8
建立 IOMMU domain 与映射
-> 配置 PASID/PRI/ATS
-> 最后允许 Bus Master 和设备队列

停止设备队列并禁止 Bus Master
-> 停止 PRI/PASID/ATS
-> flush ATC/IOTLB
-> 解除映射与 domain

顺序错误可能让设备 DMA 到已释放或已重新授权的内存。

10. RK3588 适用性

RK3588 Root Complex 驱动存在并不代表板载控制器或终端设备支持 SR-IOV/ATS/PASID。还需同时满足:

  • Endpoint 暴露相应 Capability;
  • 上游拓扑允许 ARI/ACS 等需要的路由和隔离;
  • RK3588 PCIe 对应 IOMMU/SMMU stream 已正确接入;
  • defconfig 启用PCI_IOV/PCI_ATS/PCI_PRI/PCI_PASID
  • PF 驱动实现硬件资源配置。

Rockchip 常用 defconfig 中未显式启用全部上述功能,因此部署前应以最终.config而非通用 ARM64 defconfig 为准。

文章互动

阅读 --

留言

0 条留言

正在加载留言…