【31】poisoned TLP导致的MCE问题

1、ECRC

在这里插入图片描述

   Data link layer的32 bit的LCRC是从data link layer到data link layer的CRC校验,可以保证两个data link layer之间的数据可靠性。但是TLP 通过switch时,switch会改变一些控制bit,但是不能修改其他的字段(Switch需要把TLP包拆开才知道要往哪里路由)。Switch拆包后再组包就会重新生成LCRC字段。在Switch内部路由时,数据可能被污染,但是switch使用被污染的数据,重新生成的好的LCRC,这样就掩盖了存着的错误。为了保证端到端的数据完整性,系统需要高级的数据可靠性–32bit ECRC。
  ECRC存放在TLP digest字段。ECRC包含了TLP的所有不可改变的字段。ECRC由数据源的传输层产生,在最终的接收端检查,也可以由中间接收端检查(如PCIe switch)。
  在某种情况下TLP可能在产生时就污染了,或者在Switch内部被污染了,这个时候需要用到error forwardding(poisonig data)。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、Poisoning Data(Erorr Forwarding)

下面场景下会用到error formarding(data poisoning)
(1)从main memory读数据时遇到了uncorrectable error
(2)PCI write 到main memory时出现parity error
(3)internal data buffer或者cache的出现数据完整性错误

在这里插入图片描述
在这里插入图片描述
 (1)发送端支持TLP poisoning功能是可选的
 (2)数据中毒功能仅仅适应于写请求(posted或non-posted),message with data,原子操作请求,读完成包,原子操作完成包的数据。
中毒TLP中毒是通过TLP中的EP比特来显示
在这里插入图片描述
  b。只有TLP是携带data时,才允许发送端设置EP bit为1。如果TLP没有数据,但是EP比特为1,接收端的行为是不明确的。
 (3)如果发送端支持数据中毒功能,从发送端发送的bad data的TLP需要使用上面的中毒机制。(这句话相当于屁话,没啥信息含量)
 (4)如果DP口支持Poisoned TLP Egress Blocking功能,需要使能Poisoned TLP Egress Blocking enable比特,当中毒TLP从egress port发出时,该port要把这个TLP当做Poisoned TLP Egress Blocking error,除非有更高优先级的错误。
 并且DP口要进行下面的操作:
  a. DP口不能发送这个TLP
  b. 如果Poisoned TLP Egress Blocked error被mask,并且DPC是enable的,DPC必须触发 。
  c. 如果DPC没有被触发,且TLP是non-posted请求,DP口必须返回一个completion包,这个completion包和DPC触发时一样(CA或者UR状态的completion)
在这里插入图片描述
 (5)下列带中毒数据的请求,不能修改target的值
  a.配置写请求
  b.target是完成者的控制寄存器或者控制结构的下列请求
   IO写请求,memory写请求,或者非厂商定义的带数据的message
  c.原子操作

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 协议说了一堆有用的废话,下面我们看看PCIe system architecture对于data poisoning的描述
在这里插入图片描述
  数据中毒提供了一种显示transaction中数据被污染的方式。如果接收的TLP包含data字段,如果EP被置1,则接受者可以知道数据被污染了。

在这里插入图片描述
下面场景下会用到error formarding(data poisoning)
(1)从main memory读数据时遇到了uncorrectable error
(2)PCI write 到main memory时出现parity error
(3)internal data buffer或者cache的出现数据完整性错误

  (1)请求者发起memoy写请求时,它必须先从local memory预取数据,然后发送给完成者。如果读取的数据有parity的错误,则数据会被请求者标记为中毒的。
  (2)完成者对于memory read请求,进行response时必须要返回completion with data,如果从memory中预取的data发生了parity 错误,则数据会被标记为中毒的。
  (3)cache或者buffer中存储的data出现的bit跳变等,如果cache或者buffer有错误检查能力,那么久可能检查到data corruption。虽然协议没有指明哪些cache或buffer,但是可以想象,任何transaction起源的设备或者转发transaction的设备都可能标识数据中毒了(典型的就是CPU内部SRAM,switch内部的SRAM,EP内部SRAM)
  针对第三种情况,老赵解析的比较清楚,下面摘抄一下:
公众号https://mp.weixin.qq.com/s/xPVxB4G4V5tFmWhOcr3-dw
  每个端口的进来的数据报文会在switch内部的buffer中缓存,然后由芯片的转发逻辑控制再分发传递到对应的出去的端口。这些大量存在的buffer/RAM,会有一个先天性的潜在缺陷问题:软失效。简单理解就是这些RAM,在某些情况下会发生数据跳变的问题,也就是存在RAM中的数据报文并不可靠!(关于软失效的详细说明可参考:https://wenku.baidu.com/view/1a9bfc8c360cba1aa911da41)。
  switch的端口在收到数据报文后,LCRC校验是OK的,随后这个TLP被存入switch内部的RAM(通常switch会去校验这个报文的ECRC,也是OK的)。接下来,不幸的事发生了,软失效出现了:这个TLP的报文被修改了。而Switch的发送逻辑,只是在报文上添加新的LCRC,并向其他端口发送一个已经有错误的报文。最终的接收报文设备,计算LCRC是正确的,如果没有ECRC,最终接收报文的设备将会收到一个错误的报文
在这里插入图片描述

3、Poisoning Data(Erorr Forwarding)导致的MCE问题解决方案

 说了这么多理论,说说之前遇到的过poisoned TLP导致的MCE问题。
 当时遇到poisoned TLP是从switch下面传过来的,这个poisoned TLP被转发到了CPU,CPU就MCE了(原因见下面)。但是使用了switch的drop poisoned TLP功能来规避了这个问题。其实Intel的CPU也有drop poisoned TLP的功能,AMD的CPU也有类似功能。

 下面是intel的CPU手册的关于poisoned TLP的描述。我们可以很明显的看到forward poisoned TLP到destination可能导致MCE(之前使用intel和AMD的CPU确实遇到poisoned TLP导致的MCE)。
 如果对应的severity比特是1,那么收到poison 包时会被当做fatal error处理。如果severity 比特是0,那么会当做correct eror处理,并且记录在UNCERRSTS寄存器和CORERRSTS寄存器的Advisory Non-Fatal比特。
 在Intel Xeon处理器E7-2800/4800/8800 v2产品中,POISFEN bit强制把poison error记录成Advisory Non-Fatal错误。当en_poismsg_spec_behavior是1时,poison severity 比特可以强制任务poison eror是fata了的,而不管POISFEN是什么值。
  通常MCA有比AER driver 更高的优先级,因此这个en_poismsg_spec_behavior是0
在这里插入图片描述
AMD CPU drop poisoned TLP的reg
PCIEPORT0F0x000001C0 (PCIE_RX_CNTL)
6 RX_IGNORE_EP_ERR. Read-write. 0=Report error normally. 1=Ignore error. Controls ignoring Poisoned TLP
Errors. When set, ignores EP bit on received TLP, treating it as if the TLP did not have it set. Poisoned TLP
Received error is not logged and TLP is passed to Slave Client with EP=0. AER header log (if a different error is
present) may report EP=0.
intel CPU drop poisoned TLP的reg
 poisfen为0,不转发对应poison data(如果AER poison report被disable,则可能出现无法感知的数据污染)
 poisfen为1,转发对应的poison data(如果AERpoison report被enable可能造成和MCA poison上班机制冲突)
在这里插入图片描述
PLX switch drop poisoned TLP的reg
在这里插入图片描述

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

linjiasen

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值