✨ 1. 为何要用ACS ?
🌟1.1 P2P传输风险
ATS(Address Translation Services)是一种基于信任的服务协议。如果EP端ATC(Address Translation Cache)声称其发出的访问请求是经过转换后的地址,且该地址刚好落在PCIe交换开关的BAR范围内,则该访问请求不会到达RC,而是被交换开关路由到该地址所对应的EP。也就是说,该访问请求绕过了IOMMU的隔离,进行了P2P(peer-to-peer)传输。
PCIe协议允许P2P传输,这也就意味着同一个PCIe交换开关连接下不同EP可以在不流经RC的情况下互相通信。若使用过程中不希望P2P直接通信又不采取相关措施,则该漏洞很有可能被无意或有意触发,使得某些EP收到无效、非法甚至恶意的访问请求,从而引发一系列潜在问题。
🌟1.2 解决方案 - ACS
ACS协议提供了一种机制,能够决定一个TLP被正常路由、阻塞或重定向。在SR-IOV系统中,还能防止属于VI或者不同SI的设备Function之间直接通信。通过在交换节点上开启ACS服务,可以禁止P2P发送,强迫交换节点将所有地址的访问请求送到RC,从而避开P2P访问中的风险。ACS可以应用于PCIe桥、交换节点以及带有VF的PF等所有具有调度功能的节点,充当一个看门人的角色。
✨2. ACS服务介绍
🌟2.1 ACS支持的访问控制类型
⭐️2.1.1 ACS基本能力
ACS支持以下类型的PCIe访问控制:
- ACS来源验证;
- ACS转换阻塞;
- ACS P2P请求事务重定向;
- ACS完成事务重定向;
- ACS上行转发;
- ACS P2P出口控制;
- ACS定向转换P2P。
⭐️2.1.2 ACS增强能力
为了提升ACS的隔离及保护能力,在常规ACS控制机制外提供了ACS增强能力,主要有如下四种:
- ACS I/O请求阻塞;
- ACS DSP存储器目标访问;
- ACS USP存储器目标访问;
- ACS未声明请求重定向。
🌟2.2 ACS访问控制能力的适用范围
ACS服务是默认关闭的,想要使用ACS访问控制服务需要通过软件配置ACS控制寄存器来打开对应能力。在PCIe系统中可以选择关闭ACS,也可选择全部开启或部分开启ACS访问控制能力。不同PCIe组件对ACS访问控制功能的需求不同,不同的ACS访问控制功能也并非适用于所有的PCIe组件。至于要开启或关闭哪些特定的ACS访问控制能力,则取决于具体的Function类型及其在是否为多Function设备的组成部分。PCIe各组件对ACS访问控制功能的需求,或者说ACS各访问控制能力适用的PCIe组件范围,如下表所示:
表1 ACS访问控制能力的适用范围
表注: 考虑到开启了VF的单Function设备本质上表现与多Function设备无异,ACS也可以应用于具备SR-IOV能力的单Function设备。
📌 除以上表格提到的之外,在ACS实现过程中还应注意:📢📢
- ACS绝不能用于PCIe-PCI桥之间以及RC事件收集器,这些地方也不能实现ACS扩展能力结构。
- 除ACS源头验证外,ACS访问控制不适用于多播TLP。
- RCiEP可以实现ACS但不是必须。单个RC下的RCiEP可以部分开启ACS。
🌟2.3 ACS与非ACS组件间的互操作性
📌 为了确保开启了ACS与未开启ACS的PCIe组件之间互操作性,两者之间应遵循以下原则: 📢📢
若不使用ACS组件的P2P请求重定向及P2P完成重定向功能,则ACS与非ACS组件可混合使用,不影响两者的互操作性,且ACS组件的子集仍然可开启ACS功能。
若PCIe系统使用了ACS P2P请求重定向或/和ACS P2P完成重定向功能,则PCIe系统中使用这些功能的组件必须支持ACS上行重定向请求的上行转发,尤其是 -
相关RP必须支持ACS上行转发,否则RP无法处理上行重定向请求或完成TLP,此时RC也必须实现重定向请求的验证。
每个开启了P2P事务重定向的ACS组件及相关RP之间的所有中间交换节点必须支持ACS上行转发,否则这些交换节点无法处理上行重定向事务。
🌟2.4 ACS P2P控制交互
对于每一笔P2P请求,多个ACS控制机制会相互影响并最终决定将当前请求的处理方式:① 直接路由到P2P目标、② 视为ACS违例立即拦截 或③重定向上行至RC进行访问验证。P2P完成重定向不受制于ACS P2P 完成重定向机制。
若Port/Function开启了ACS定向转换P2P功能,无论ACS P2P请求重定向及ACS P2P出口控制设置如何,AT域显示为转换后地址的P2P间存储器访问请求必须被正常路由至其P2P目的Port/Function。如果没有开启ACS定向转换P2P功能,P2P间存储器访问请求必须无条件服从ACS P2P请求重定向及ACS P2P出口控制设置相关机制。具体而言,就是出口控制向量比特、ACS P2P出口控制使能比特(E)及ACS P2P请求重定向比特(R)三者共决定如何处理该P2P请求,如下表所示。
表2 ACS P2P请求重定向及ACS P2P出口控制交互
⚠️ 注意:由于传统Device支持锁定访问,若ACS P2P请求重定向目标为传统Device,无法保证访问的原子性。
🌟2.5 ACS违例错误处理
硬件或软件设计缺陷均有可能导致ACS违例。为便于隔离错误及分析错误原因,建议在ACS组件中实现AER(Advanced Error Reporting)能力。开启AER prefix/header记录功能后,若出现ACS违例,可通过分析违规请求的prefix/header来定位出现问题的原因。
当出现ACS违例时,作为完成者的ACS组件应遵循以下规则进行处理:
对于非转发请求,完成者需产生完成状态为CA的完成事务;
完成者需记录并上报ACS违例错误。即便已经发出了CA完成事务,也应照常记录并上报ACS违例错误,并对错误进行记录;若该错误为非致命错误,则按照相关规则对该错误进行处理。
🌟2.6 ACS重定向对排序规则的影响
开启了ACS P2P请求重定向功能后,重定向之后的P2P请求会出现违反常规的事务排序规则的情况。
⭐️2.6.1 排序违例1 - 完成事务超过转发请求事务
排序违例:根据PCIe事务排序规则,非宽松排序的完成事务不允许超过转发请求事务。但当P2P转发请求被重定向后,其后续P2P非宽松完成事务会直接被路由到P2P目的地,从而超过了重定向后的转发请求事务。
解决方案:为了避免以上这种排序违例,可用开启ACS P2P完成重定向功能。开启了ACS P2P完成重定向功能后,所有的P2P非宽松排序完成事务会同P2P转发请求一样被重定向。由于相同TC的请求事务可用超过完成事务,开启完成事务重定向后,即便未开启P2P转发请求重定向,也不会影响排序规则。
开启了ACS完成事务从定向后,所有的的P2P完成事务都会被先先送往RC再送往P2P目的地,显然这比直接送往P2P目的地要慢,影响传输性能。考虑到开启了宽松排序的完成事务不会被重定向,强烈建议请求者开启完成事务宽松排序,一次提升性能。
⭐️2.6.2 排序违例2 - 请求事务超过转发请求事务
排序违例:根据PCIe事务排序规则,非转发请求事务或非宽松排序的转发请求事务不允许超过转发请求事务。若ACS P2P请求重定向功能及ACS定向转换P2P功能同时开启,很容易出现部分P2P请求被重定向、部分P2P请求直达P2P目的时的情况,从而引起排序规则违例。
解决方案:为避免这种排序违例的发生,只有在提前确定该违例不会发生的情况下才能同时开启这两种ACS功能。
✨3. ACS软件配置
并不是所以的PCIe组件都具备ACS能力,也不是具备ACS能力的PCIe组件具备所有的ACS访问控制能力。在PCIe设备枚举时,软件查看PCIe ACS扩展能力结构寄存器(图2,图3)来确认PCIe组件是否具备ACS访问控制能力,软件读取ACS能力寄存器来获知其具备哪些ACS能力(图4)。ACS服务在硬件上是默认关闭的,想要使用ACS访问控制服务需要通过软件配置ACS控制寄存器(图5)来打开对应能力。
图2 ACS扩展能力结构
图3 ACS扩展能力结构头标
图4 ACS能力寄存器
📚 参考
PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
PCI-SIG, ACS Enhancement
PCIE总线的地址问题
PCI-SIG SR-IOV Primer
IOMMU group and PCIe ACS问题
Introduction to PCIe Access Control Services
IOMMU是如何划分PCI device group的
PCIe Glossary | PLDA
PCI Passthrough with PCIe devices behind a non-ACS switch in vSphere