PCIe事务排序(Transaction Ordering)

简介: PCIe事务排序(Transaction Ordering)

1. PCIe事务排序概念


1.1 PCIe事务排序需求

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


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



1.2 PCIe事务排序基本规则


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



  1. 相同TC的事务遵循强排序规则;


  1. 不同TC的事务不存在排序关系;由于相同TC不能映射到不同VC,所以不同VC的事务也不存在排序关系;


  1. 所有事务(Mem/IO/Cfg/Msg)遵循相同的排序规则;


  1. 特定情况下开启了宽松排序的事务可以排在其他相同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发送后进行发送,造成阻塞。


72c57ff9caaf4037b46f8366eefedd05.png



2.2 弱排序


 实际上,非转发->转发事务未出现在生产者-消费者模型中,无需遵循强排序规则,这种无意义的阻塞导致了总线浪费。对于这种生产者-消费者模型之外的事务序列,可以选择行地开启弱排序来提高总线利用率。PCIe弱排序规则如图2所示。其中第一行(列#2~#5)的事务先行到达,第一列(行#A ~#E)的事务后来到达。


图中阴影区域与生产者-消费者模型无关。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Y/N表示在不违反生产者-消费者模型的前提下,可以采用弱排序,后来的事务允许在先行到达的事务之前进行发送,但非必须。



e0a0d9a875cc4f9d8cb7127f1f0d5942.png


图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;


  1. RO=1的Msg可超过RO=0的Mwr;


  1. RO=1的MWr可超过RO=0的Msg;


  1. RO=1的Msg可超过RO=0的Msg;


  1. RO=1的读完成可超过RO=0的Mwr;


  1. RO=1的读完成可超过RO=0的Msg;



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


e7765f32b37a47149838402967f5334f.png


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


148a526419eb4de39a18e6eabd91ce6b.png


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


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


b9862da3cea64cdd9ac9c24ec925b320.png

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




3. PCIe事务排序规则总结


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



36abf202eb1d402d8a360f526fd198bd.png



对该表格的解释如下:


  •        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 事务排序机制





目录
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
十四、事务Transaction
十四、事务Transaction
70 0
PCIe锁定事务(Locked Transactions)介绍
PCIe锁定事务(Locked Transactions)介绍
683 0
PCIe锁定事务(Locked Transactions)介绍
|
存储 缓存 监控
TSO(Timestamp Ordering)
TSO(Timestamp Ordering)是一种常用的时钟同步机制,用于在分布式系统中保证时钟的一致性和事务的顺序性。去共识的TSO实现可以有效提高TSO的服务稳定性,以下是一些实现思路:
428 0
|
SQL 缓存 Oracle
PostgreSQL 14中提升Nested Loop Joins性能的enable_memoize
PostgreSQL 14中提升Nested Loop Joins性能的enable_memoize
213 0
|
存储 算法 网络性能优化
【AXI】解读AXI协议事务属性(Transaction Attributes)
【AXI】解读AXI协议事务属性(Transaction Attributes)
【AXI】解读AXI协议事务属性(Transaction Attributes)
|
SQL 安全 算法
精通Java事务编程(7)-可串行化隔离级别之两阶段锁定(2PL,two-phase locking)
近30年,DB只有一种广泛使用的串行化算法:两阶段加锁 1 2PL不是2PC 请注意,虽然两阶段锁定(2PL)听起来非常类似于两阶段提交(2PC),但是完全不同概念
227 0
|
存储 算法
Consensus On Transaction Commit
使用分布式一致性算法替代2PC/3PC中的TM,能达到容错的分布式事务提交算法。 改算法使用Paxos和2PC高度融合,达到和2PC一样的延时。
Consensus On Transaction Commit