首页 理论教育PCIExpress数据传送序引发的死锁

PCIExpress数据传送序引发的死锁

【摘要】:图11-3 PCI总线中死锁实例2PCI桥A与PCI设备B的工作流程如下所示。因此PCI桥首先需要重试来自PCI设备的读完成,然后将存储在PCI桥中的这个Posted写请求刷新出去,详细原因见第11.3.1节。如果这个Posted写请求的目的设备恰好是需要从存储器读取数据的PCI设备,此时将可能发生死锁。产生该死锁的原因与PCI总线的序相关,合理地安排这些总线事务的访问序将可以避免这类死锁,下文将详细介绍PCI总线的序。下文将继续介绍有关PCI总线序引发的死锁问题。

本节首先分析一个在PCI总线中死锁的实例。假设在PCI桥A中存放了一个Posted写请求,该请求正在准备发向Secondary PCI总线。而在PCI桥A还没有获得Seconday PCI总线的使用权时,Secondary总线上的PCI设备B,需要使用Delayed总线事务通过该PCI桥从主存储器中读取数据。如图11-3所示。

978-7-111-29822-9-Part02-153.jpg

图11-3 PCI总线中死锁实例2

PCI桥A与PCI设备B的工作流程如下所示。

(1)首先PCI设备B发出的存储器读请求已经从存储器中获得数据,HOST主桥将这个存储器读请求转换为存储器读完成。当这个存储器读完成穿越PCI桥时,要求刷新PCI桥中的Posted写请求(从Primary总线到Secondary总线的Posted写请求)。因此PCI桥首先需要重试来自PCI设备的读完成,然后将存储在PCI桥中的这个Posted写请求刷新出去,详细原因见第11.3.1节。

(2)如果这个Posted写请求的目的设备恰好是需要从存储器读取数据的PCI设备,此时将可能发生死锁。假设在PCI桥A暂存的Posted写的目的地恰好为PCI设备B。(www.chuimin.cn)

(3)PCI设备B发现有发向自己的Posted写请求时,并不接收这个请求,而是使用重试周期拒绝这个写请求,因为这个PCI设备希望从存储器读取完数据后,才能接收这个写请求。

(4)此时在PCI桥A中暂存的Posted写无法完成,同时PCI设备B的读完成请求也无法穿越PCI桥A,此时将产生死锁。

产生这个死锁的原因是PCI设备B需要完成存储器读之后才能接收Posted存储器写,如果PCI设备B可以先接收Posted存储器写,之后再进行存储器读完成请求,这个死锁就可以避免。产生该死锁的原因与PCI总线的序相关,合理地安排这些总线事务的访问序将可以避免这类死锁,下文将详细介绍PCI总线的序。

在PCI总线中,如果没有合适地处理序的问题,将产生多种类型的死锁。本节所讲述的仅是其中一个较为简单的实例。下文将继续介绍有关PCI总线序引发的死锁问题。PCI总线通过安排访问顺序,可以合理地解决这类死锁问题。