PCIe事务排序(Transaction Ordering)

本文详细解析PCIe事务排序的必要性、基本规则、常见方法(强排序、弱排序、宽松排序和基于ID排序),并探讨其优点、死锁避免策略,以及无死锁排序规则的应用实例。涵盖了PCIe技术的兼容性和效率提升关键点。
摘要由CSDN通过智能技术生成

1. PCIe事务排序概念

1.1 PCIe事务排序需求

  相同传输类型(Traffic Class, TC)的多个事务同时通过统一通道时,需要对多个事务进行排序。PCI/PCIe排序规则应满足以下特征:

  • 满足基于生产者-消费者编程模型的强排序准则;
  • 若请求者已知其发生的当前事务独立于早前事务,可在强排序基础上放松规则,采用宽松排序;
  • 多个设备的事务同时到达同一交换开关时,交换设备应允许PCIe事务重排序,即采用基于ID的排序方法;
  • PCIe系统链路中存在PCI/PCI-X桥时,PCIe协议的排序规则应能够避免死锁。
1.2 PCIe事务排序基本规则

  生产者-消费者模型是分布式系统中较为经典的多线程并发协作模型,其遵循强排序规则。PCIe事务以生产者-消费者模型为基础,具有以下基本排序规则:

  1. 相同TC的事务遵循强排序规则;
  2. 不同TC的事务不存在排序关系;由于相同TC不能映射到不同VC,所以不同VC的事务也不存在排序关系;
  3. 所有事务(Mem/IO/Cfg/Msg)遵循相同的排序规则;
  4. 特定情况下开启了宽松排序的事务可以排在其他相同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发送后进行发送,造成阻塞。

PCIe强排序引起的阻

图1 PCIe强排序引起的阻塞

2.2 弱排序

  实际上,非转发->转发事务未出现在生产者-消费者模型中,无需遵循强排序规则,这种无意义的阻塞导致了总线浪费。对于这种生产者-消费者模型之外的事务序列,可以选择行地开启弱排序来提高总线利用率。PCIe弱排序规则如图2所示。其中第一行(列#2~#5)的事务先行到达,第一列(行#A ~#E)的事务后来到达。图中阴影区域与生产者-消费者模型无关。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Y/N表示在不违反生产者-消费者模型的前提下,可以采用弱排序,后来的事务允许在先行到达的事务之前进行发送,但非必须

PCIe弱排序规则

图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时,能够被交换开关重排序的事务如下:

  1. RO=1的MWr可超过RO=0的Mwr;
  2. RO=1的Msg可超过RO=0的Mwr;
  3. RO=1的MWr可超过RO=0的Msg;
  4. RO=1的Msg可超过RO=0的Msg;
  5. RO=1的读完成可超过RO=0的Mwr;
  6. RO=1的读完成可超过RO=0的Msg;

  具体使用过程中,软件驱动程序通过配置设备控制寄存器bit4来开启设备的宽松排序能力。发送的事务中,TLP属性位attr bit[1] 置一表征该事务支持宽松排序。在配置请求、IO请求、消息请求及上报中断消息的存储请求事务中,宽松排序属性必须清零。

device_ctrl_reg

图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排序。

device_ctrl2_reg

图4 PCIe Device Control 2 Reg

2.5 无死锁的PCIe事务排序规则

  图2强排序+宽松排序+弱排序规则能够提升PCIe总线利用效率,但在有PCI桥的系统中仍然不能避免死锁。为了解决死锁问题,在图2规则的基础上继续完善,有了图5所示排序规则。Yes表示阻塞发生时,后来事务 必须 重拍到先到事务之前。A5b/A6b仅用于PCIe-PCI桥和PCIe-PCI-x桥。

无死锁的PCIe事务排序规则

图5 无死锁的PCIe事务排序规则


3. PCIe事务排序规则总结

  PCIe事务排序规则如图6所示。其中第一行Col #2~#5的事务先行到达,第一列Row #A~#D的事务后来到达。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Yes表示后来的事务必须在先行到达的事务前发送;Y/N表示后来的事务允许在先行到达的事务之前进行发送,但非必须

PCIe排序规则

图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相同求对应不同地址,不能乱序。

参考

  1. PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
  2. PCI Express Technology - Comprehensive Guide to Generation 1.x, 2.x and 3.0. Mike Jacson, Ravi Budruk, MindShare, Inc.
  3. PCI、PCI-X和PCI Express的原理及体系结构,马锦明,朱剑冰 等著
  4. PCIe系列专题之二:2.8 事务排序机制

评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值