1. PCIe事务排序概念
1.1 PCIe事务排序需求
相同传输类型(Traffic Class, TC)的多个事务同时通过统一通道时,需要对多个事务进行排序。PCI/PCIe排序规则应满足以下特征:
- 满足基于生产者-消费者编程模型的强排序准则;
- 若请求者已知其发生的当前事务独立于早前事务,可在强排序基础上放松规则,采用宽松排序;
- 多个设备的事务同时到达同一交换开关时,交换设备应允许PCIe事务重排序,即采用基于ID的排序方法;
- PCIe系统链路中存在PCI/PCI-X桥时,PCIe协议的排序规则应能够避免死锁。
1.2 PCIe事务排序基本规则
生产者-消费者模型
是分布式系统中较为经典的多线程并发协作模型,其遵循强排序规则。PCIe事务以生产者-消费者模型为基础,具有以下基本排序规则:
- 相同TC的事务遵循强排序规则;
- 不同TC的事务不存在排序关系;由于相同TC不能映射到不同VC,所以不同VC的事务也不存在排序关系;
- 所有事务(Mem/IO/Cfg/Msg)遵循相同的排序规则;
- 特定情况下开启了宽松排序的事务可以排在其他相同TC事务之前发送。
若PICe生产者-消费者相关事务的TC值相同且未开启宽松排序,则PCIe基本排序规则支持生产者-消费者模型。
1.3 PCIe事务排序优点
PCIe对事务进行排序有以下优点:
- 做到对传统PCI、PCI-X、AGP协议的兼容;
- 避免死锁的发生;
- 提升PCIe总线的传输效率;
- 保证事务的完成顺序符合开发者意图。
2. 常用的PCIe事务排序方法
常用的PCIe事务排序方法有强排序(Strong Ordering)、弱排序(Weak Ordering)及宽松排序(Relaxed Ordering) 三种。此外还有基于ID的事务排序(ID Based Ordering, IDO)规则。
2.1 强排序
强排序是指所有事务强制按照到达时间先后进行发送,不区分事务的轻重缓急,一视同仁,不允许出现特例。当来自多个设备的事务聚集在交换开关时,一个事务无法发出会影响所有后续的事务的发送,导致事务阻塞。
举个PCIe强排序引起的事务阻塞例子:如图1,PCIe所有事务统一编号,按照到达的Tx VC buffer先后顺序编号为#1~8。这8个事务分为转发事务、非转发事务及完成事务。此时,Rx VC Buffer中对应的NP buffer已满,没有剩余credit,发送端非转发事务#1暂停发送。强排序规则下,事务#2必须等待事务#1发送后进行发送,造成阻塞。
图1 PCIe强排序引起的阻塞
2.2 弱排序
实际上,非转发->转发事务未出现在生产者-消费者模型中,无需遵循强排序规则,这种无意义的阻塞导致了总线浪费。对于这种生产者-消费者模型之外的事务序列,可以选择行地开启弱排序来提高总线利用率。PCIe弱排序规则如图2所示。其中第一行(列#2~#5)的事务先行到达,第一列(行#A ~#E)的事务后来到达。图中阴影区域与生产者-消费者模型无关。No
表示后来的事务不能
先于先行到达的事务发送,即两者间不能重排序;Y/N
表示在不违反生产者-消费者模型的前提下,可以采用弱排序,后来的事务允许
在先行到达的事务之前进行发送,但非必须
。
图2 遵循弱排序的PCIe排序规则(阴影部分)
各VC依据其buffer空满情况独立控制其事务排序情况,互不干扰。同一VC内按照收到的转发、非转发、完成事务类型分装到不同buffer内,当其中一个buffer满时,不影响其他buffer收发事务,更易于采用弱排序方法的实现。
需要注意的是: 采用 弱排序规则不能保证程序按预期执行。例如在读请求->写请求序列中,读请求于写请求的操作地址相同,此时若写请求被重排在读请求之前,新写的数据会覆盖掉原来的数据,导致读完成返回的数据与预期行为不符。若不希望这种情况发生,则必须保证在写请求之前完成读请求,即关闭弱排序。
2.3 宽松排序
如前文所述,PCIe事务中只有生产者-消费者相关的事务才需遵顼强排序,其他与生产者-消费者无关的事务则无需遵循强排序规则。若PCIe排序一味遵循强排序规则,会使与生产者-消费者无关的事务被阻塞,从而影响PCIe总线效率。若采用弱排序规则,其又不能保证程序按预期执行。为了提升PCIe总线效率,并保证顺序如期执行,PCIe支持宽松排序机制(PCI-X亦支持)。即允许PCIe交换开关将软件确认过的事务(RO=1,开启了宽松排序)重排在其他事务之前发送。
宽松排序规则适用于相同TC且沿相同方向移动的事务。同时满足生产者-消费者模型、也支持宽松排序的PCIe排序规则如图2非阴影区域所示。No
表示后来的事务不能
先于先行到达的事务发送,即两者间不能重排序;Y/N
表示在软件确认开启了宽松排序(RO=1)前提下,后来的事务允许
在先行到达的事务之前进行发送,但非必须
。
RO=1时,能够被交换开关重排序的事务如下:
- RO=1的MWr可超过RO=0的Mwr;
- RO=1的Msg可超过RO=0的Mwr;
- RO=1的MWr可超过RO=0的Msg;
- RO=1的Msg可超过RO=0的Msg;
- RO=1的读完成可超过RO=0的Mwr;
- RO=1的读完成可超过RO=0的Msg;
具体使用过程中,软件驱动程序通过配置设备控制寄存器bit4来开启设备的宽松排序能力。发送的事务中,TLP属性位attr bit[1] 置一表征该事务支持宽松排序。在配置请求、IO请求、消息请求及上报中断消息的存储请求事务中,宽松排序属性必须清零。
图3 PCIe Device Control Reg
需要注意的是,若一个读请求返回了多个读完成,这些相同事务ID的读完成必须按需返回,即图2中D5b所示NO。考虑到PCI桥具有推迟事务的特性,强排序+宽松排序规则可在纯PCIe系统中消除死锁,但不适用于含有PCI桥的PCIe系统。
2.4 基于ID排序
某一时间交换开关接收到了来自多个PCIe设备的请求事务,这些事务间有以下特性:① 源自不同PCIe设备的请求事务极大概率不存在依赖关系; ② 由于事务途径的路径不同,某设备在发出请求事务后很难获知其他请求事务的完成情况。基于此,PCIe 2.1中引入了基于ID的排序方式来优化排序、提升传输性能。
具体使用过程中,软件驱动程序通过配置设备控制寄存器2的bit[8,9]来开启设备IDO能力。发送的事务中,TLP属性位attr bit[2] 置一表征该事务支持基于ID排序。
图4 PCIe Device Control 2 Reg
2.5 无死锁的PCIe事务排序规则
图2强排序+宽松排序+弱排序规则能够提升PCIe总线利用效率,但在有PCI桥的系统中仍然不能避免死锁。为了解决死锁问题,在图2规则的基础上继续完善,有了图5所示排序规则。Yes
表示阻塞发生时,后来事务 必须 重拍到先到事务之前。A5b/A6b仅用于PCIe-PCI桥和PCIe-PCI-x桥。
图5 无死锁的PCIe事务排序规则
3. PCIe事务排序规则总结
PCIe事务排序规则如图6所示。其中第一行Col #2~#5的事务先行到达,第一列Row #A~#D的事务后来到达。No
表示后来的事务不能
先于先行到达的事务发送,即两者间不能重排序;Yes
表示后来的事务必须
在先行到达的事务前发送;Y/N
表示后来的事务允许
在先行到达的事务之前进行发送,但非必须
。
图6 PCIe排序规则
对该表格的解释如下:
- A2a:无特殊设置时,后来的转发请求不允许超过先行的转发请求。
- A2b:① RO=1、②IDO=1且两者ID或TLP前缀的PASID不同时,后来的转发请求可以超过先行的转发请求。
- A3, A4:后来的转发请求在阻塞的情况下必须超过先行的非转发请求,以避免死锁。
- A5a:后来的转发请求可以超过完成事务,但不强求。
- A5b:对于从PCIe往PCI/PCI-X桥方向的事务,后来的转发请求在阻塞的情况下必须超过先行的完成事务,以避免死锁。
- B2a:无特殊设置时,后来的读请求不允许超过先行的转发请求。
- B2b:IDO=1且两者ID或TLP前缀的PASID不同时,后来的读请求可以超过先行的转发请求。
- C2a:无特殊设置时,后来的带数据的非转发请求不允许超过先行的转发请求。
- C2b:① RO=1、②IDO=1且两者ID或TLP前缀的PASID不同时,后来的带数据的非转发请求可以超过先行的转发请求。
- B3,B4,C3,C4:后来的非转发请求允许超过先行的非转发请求。
- B5,C5:后来的非转发请求允许超过先行的完成事务。
- D2a:非特殊情况时,后来的完成事务不允许超过先行的转发请求。
- D2b:后来的IO/Cfg完成事务允许超过先行的转发请求;① RO=1、②IDO=1且两者完成者ID不同时,后来的完成事务可以超过先行的转发请求。
- D3,D4:后来的完成事务在阻塞的情况下必须超过先行的非转发请求,以避免死锁。
- D5a:Transaction ID不同的完成事务可以互相超越。
- D5b:Transaction ID相同的完成事务必须按照收到的顺序发送,不能互相超越。用于单笔内存读请求多笔完成数据的情况,躲避完成数据之间Transaction ID相同求对应不同地址,不能乱序。
参考
- PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
- PCI Express Technology - Comprehensive Guide to Generation 1.x, 2.x and 3.0. Mike Jacson, Ravi Budruk, MindShare, Inc.
- PCI、PCI-X和PCI Express的原理及体系结构,马锦明,朱剑冰 等著
- PCIe系列专题之二:2.8 事务排序机制