AR# 47549

Zynq-7000 SoC, APU - 当相同高速缓存线同时被 CPU 和 ACP 访问时,SMP 模式下会发生系统死锁

描述

在极其少见的情况下,一些具有多个 CPU 全缓存线写入的危险 ACP 请求会造成 SCU 中的仲裁问题,从而引发处理器锁死。只有当 CPU 工作在 SMP 模式且在一致的存储器区域,一个 CPU 写入高速缓存线,并且几乎同时另一个 CPU 读取相同的高速缓存线,而 ACP 也向高速缓存线发出请求时,这个问题才会发生。

此问题影响 SMP 系统,但不太可能会发生,因为时序窗口非常小,而三个请求都以一个高速缓存线为中心。如果操作系统中无法避免这种情况,那么可设置控制位,从而不让这个问题发生。

解决方案

影响:

很小。预计不会发生。如欲了解更多信息,敬请参见以下影响详情。

解决方法::

如欲了解有关可用软件解决方案的更多信息,敬请参见以下详情。

受影响的配置:

使用 ACP 端口且两个 ARM 处理器都在 SMP 模式下的系统。

受影响的器件修订版本:
全部。 无计划修复。参考 (Xilinx Answer 47916) - Zynq-7000 SoC 芯片版本差异。

 

在极其罕见的情况下,一些具有两个处理器的全高速缓存线写入的危险 ACP 请求可引起 SCU 中的仲裁问题,进而导致处理器锁死。

当这两个处理器工作在 SMP 模式下和coherent memory区域(Write-Back Shared)时,就会出现这个问题。这两个处理器需要执行全高速缓存线写入,且 ACP 需要执行对某些处理器请求造成危险的一致性请求。

以下描述了可能导致锁死的一个情景:

    CPU0 在地址 A 执行全高速缓存线写入(若该写入在 SCU 中造成危险,则说明另一个 CPU 或 ACP 已经在执行该高速缓存线访问)。
    CPU0 随后在地址 B 处执行完整的高速缓存行写入。
    然后,CPU0 在地址 C 上执行读取请求(这种读取在 SCU 中存在危险,CPU1 的第二次请求将在下面提到)。

几乎在同一时间:

    CPU1 在地址 D 执行全高速缓存线写入(若该写入在 SCU 中造成危险,则说明另一个 CPU 或 ACP 已经在执行该高速缓存线访问)
    CPU1 在地址 C 处执行完整的高速缓存行写入。
    CPU1 在地址 B 上执行读取请求(这种读取在 SCU 中存在危险,CPU0 的第二次请求将在上面提到)。

最后:

    ACP 在地址 B 执行读取或写入请求(该请求造成 CPU1 第三个请求的危险)。

在此情况下,在极其罕见的条件下,所有请求方(CPU0、CPU1 及 ACP)可能到最后都会遇到危险。SCU 中的伪循环仲裁可能最终会锁死在 ACP 上,因此,无论是 CPU 还是 ACP 请求都无法传输进程,从而导致系统锁死。

影响详情

影响较小。当此问题发生时,会导致系统锁死。需重点注意的是导致锁死的情景极其少见:它要求两个处理器写入一致的全高速缓存线,且不带任何信号量,同时 ACP 也要访问相同的高速缓存线,这就意味着随后的访问是非确定性的。再加上微架构时序条件极少出现瑕疵,因此说明这个问题不太可能导致真实系统出现重大故障。

解决方法详情

此问题有一个软件解决方法,就是设置 CP15 c15 0 c0 1 中无文档记录的诊断控制寄存器的位 21。

该位只能在安全状态下写入,请按照以下 Read/Modify/Write 代码顺序:

    MRC p15,0,rt,c15,c0,1
    ORR rt,rt,#0x200000
    MCR p15,0,rt,c15,c0,1

该位经设置后,总线接口单元的直接收回优化被禁用,可避免故障发生。

设置该位可避免处理器在执行全高速缓存线写入的密集流量时使用全带宽,系统可能会出现性能略有下降的情况。

请注意,只要以下两个位已经在无文档记录的诊断控制寄存器中设置,就不会发生故障:

    位 23 禁用读取分配模式
    位 22 禁用写入分配等待模式

链接问答记录

主要问答记录

Answer Number 问答标题 问题版本 已解决问题的版本
47916 Zynq-7000 SoC 器件:芯片修订差异 N/A N/A
AR# 47549
日期 05/23/2018
状态 Active
Type 设计咨询
器件