Posted Transaction
所谓Posted Transaction,意思是指当数据发送到接收端的设备后,当前事务就完成了,发起事务的Requester就可以继续做下一件事了。因此,Posted Transaction不会导致Requester hang住。发起事务的Requester并不知道什么时候数据到达,甚至不知道是否真的到达了目的地。事务在传输路径上丢失,系统也不会收到任何的通知。
Posted Transaction主要包括Memory write和消息,并通过地址路由或者隐式路由。
图中的MWr表示Memory Write Request。
注意:没有从Completer返回给Requester的完成报文。
我们来看看Posted Transaction通过Switch的情况,如下图:
- 正常情况下,报文从SwitchA的ingress port(图中是upstream port)进入,并被Switch A路由到egress port,再进入Switch B的upstream port,继续上述的过程,直到最终到达本次事务的接收者(即最下面的EP)。
- 假如报文进入Switch A以后,Switch A的下行口(egress port)的link已经down掉了,即SwitchA和Switch B之间的链路断掉。那么这个报文是不能从SwitchA的下行口发送出去的。Switch A只能默默的把这个报文给“吃掉”,并且很遗憾,Requester并不知道。
最后提醒一下,有个概念很容易迷惑初学者。所谓的Posted Transaction,仅是指没有完成报文的返回,并不是说Completer没有应答,PCIe的点对点传输,采用了Ack/Nak的机制,后续我们会讲到。
举个例子:我白给你发红包,并且你不需要给我打收据,这就是Posted事务。
你说收到,谢谢,这个是应答Ack。你说不要,使不得,这也是个应答Nak。
我把红包给了另一个人,告诉他转交给你,类似于报文经过了Switch。他答应了我转交,我认为这个Posted事务就完成了。至于另一个人是不是把红包真的给了你,我不得而知。