PCIe 总线传输顺序的那些坑

  1. 设置了 Relaxed Ordering 也不一定生效。

在 TLP 的 Attr 字段有个 Relaxed Ordering 位,表示该 TLP 是否支持 Relaxed Ordering。但即使将这个位设置为 1,如果 TLP 通过的 Switch 设备不支持 Relaxed Ordering,那也只能乖乖的按照强制顺序通过这个 Switch。


  1. Relaxed Ordering 关注的是 VC,不是 TC。

每个 TLP 都有一个唯一的 TC(Traffic Class),而这个 TC 又和一个唯一的 VC(Virtual Channel)对应。VC 相同的 TLP 间的传送遵循 Relaxed Ordering 原则,而 VC 不同的 TLP 之间没有顺序要求。

需要注意的是,一个 TC 只能对应一个 VC,但是一个 VC 可以对应多个 TC。例如,TC1 和 TC2 都可以使用 VC1,但是 TC1 不能在使用 VC0 的同时还使用 VC1。


  1. 在 Relaxed Ordering 的作用下,“写”可以超越“写”。

当 Posted Request 的 Relaxed Ordering 位为 1 时,Posted Request TLP 可以超越之前的 Posted Request TLP!


  1. Read Request 不能超越之前的 Posted Request,除非 Requester ID 不同。

这个不是坑,恰恰相反,这是个很安全的举措。


  1. Non-Posted TLP 能超越之前的 Non-Posted TLP。

某个 Endpoint 发起 DMA 读操作,先向 RC 发送 Memory Read Request,假设发送了 4 个读请求 R1/R2/R3/R4,每个读请求要读的数据长度为 64 Bytes;RC 收到读请求之后,返回 4 个 Completion TLP,分别为 C1/C2/C3/C4,每个 Completion 的数据长度也是 64 Bytes。EP 按照 R1 -> R2 -> R3 -> R4 的顺序发出 Memory Read 请求之后,这 4 个请求在通过 Switch 之后可能会出现乱序,从而导致最终 RC 收到的请求就是乱序的,如 R2,R4,R3 和 R1,因此,RC 发送给 EP 的 Completion 顺序就是 C2,C4,C3 和 C1。 对 EP 进行设计时,必须处理这种乱序的情况。


  1. 在 Relaxed Ordering 的作用下,Completion 可以超越 Posted Request。

感觉上有可能会造成问题,实际的问题场景还没想到,先记录下来。


  1. Transaction ID 不同的 Completion 之间可以互相超越。

背景:PCIe 总线上的两个设备 A 和 B,设备 A 的 Max_Read_Request_Size 为 256 Bytes,设备 B 的 Max_Payload_Size 是 64 Bytes。

现在设备 A 要从 设备 B 读取 512 Bytes 数据,由于超出设备 A 的 Max_Read_Request_Size,所以设备 A 会发起两个 Memory Read Request 请求,这两个请求的 Tag 值分别为 0 和 1,记为 RT0 和 RT1,每个请求的对应的数据长度为 256 Bytes。针对 RT0,设备 B 会返回 4 个 64 Bytes 的 Completions,记为 C1T0,C2T0,C3T0 和 C4T0。针对 RT1,设备 B 会返回 4 个 64 Bytes 的 Completions,记为 C1T1,C2T1,C3T1 和 C4T1

C1T0,C2T0,C3T0 和 C4T0 使用的 Tag 字段为 0,C1T1,C2T1,C3T1 和 C4T1。使用的 Tag 字段为 1,这也就意味着这两组 Completions 使用的 Transaction ID 不同,因此可以彼此超越

C1T0,C2T0,C3T0 和 C4T0 之间必须保证按照 1 -> 2 -> 3 -> 4 的顺序传递。

C1T1,C2T1,C3T1 和 C4T1 之间必须保证按照 1 -> 2 -> 3 -> 4 的顺序传递。


  1. MSI / MSI-X 请求的顺序可能会导致问题。

MSI / MSI-X 请求与普通的 Memory Write 请求并没有本质的区别,所以在传输顺序上和 Memory Write 相同。

假设一个 PCIe 设备正在使用 DMA 写操作,将一组数据传递到主存储器,此时该设备将使用 Memory Write TLP 进行数据传送,当数据传送完成后,使用 MSI 请求通知处理器 DMA 写操作已经结束。

如果数据传输的 Memory Write TLP 和 MSI 请求使用的 TC(Traffic Class)不同,那么这两种 TC 可能使用的 VC 也不相同。按照协议规定,不同 VC 的 TLP 在传输顺序上没有先后关系,也就导致 MSI 请求可能比数据 Memory Write TLP 更早到达 RC,此时就会造成数据完整性问题。

为了避免此类问题,必须确保 MSI TLP 与 数据传输 TLP 使用相同的 TC 。

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值