Zynq-7000 SoC, APU - 始终被处理器写入的一级缓存行一致性请求可能出现服务拒绝

描述
一个针对相同 L1 高速缓存线路执行连续写入流的处理器可能会阻止另一个一致的处理器或 ACP 访问相同的高速缓存线路。

(1楼)以下实例描述了一个可能触发该问题的场景: CPU0 在地址

judyzhong 在 星期一, 06/11/2018 - 16:24 发表。

以下实例描述了一个可能触发该问题的场景:

  • CPU0 在地址 A 中针对一致的内存区域执行读取访问。
  • CPU1 继续执行一个环路,它只包含针对相同高速缓存线路(作为地址 A)的写入操作。
  • 在本实例中,Cortex-A9 MPCore 的仲裁方案总是优先考虑来自 CPU1 的写入请求,防止 CPU0 的成功读取。CPU0 停滞不前,无法实现进一步发展。

    注意,CPU0 不能完成其一致的读取访问,因此不仅无法进行任何调试模式,而且也无法采取中断措施。如果也不能中断 CPU1,例如,如果 CPU1 已禁用其中断,或者如果所有中断都路由到了 CPU0,这可能会导致系统活锁。

    影响: 很小。其它一致性代理上的拒绝服务可能会导致性能问题,也可能会引起潜在的系统活锁。 
    如果不能中断正在执行连续写入流的处理器,则可能会发生系统活锁。
    解决方法:: 中断连续写入流,参考解决方法详细信息。
    受影响的配置: 使用两个 CPU 或一个 CPU 和 ACP 的系统。
    受影响的器件修订版本: 全部. 无计划修复. 请参考(Xilinx 答复 47916) - Zynq-7000 SoC 芯片修订版差异。
    第三方 Errata: Arm Errata 791420

    解决方法详情

    要解决该问题,您可以通过在执行写入流的环路中插入一个 DMB 指令来中断导致活锁的连续写入流。

    如果不能修改导致写入流的软件,建议强制 CPU1 定期采取中断措施,起到看门狗的作用。

    有几种方法可产生定期中断,这些方法可能是系统专用的。由本地定时器、全局定时器或性能监控器单元循环计数器溢值产生的中断可作为选择。