重启CPU,在低频期间最终无响应

时间:2018-03-28 22:16:47

标签: linux-kernel arm kernel cpu cpu-architecture

我正在进行一组内核更改,这些更改允许我在运行时对CPU进行欠压。我经常遇到的极端低压的一个后果就是CPU变得完全没有反应。

我尝试使用函数cpu_upcpu_down,希望让内核恢复CPU,但无济于事。

有没有办法从这种状态恢复CPU?内核是否有任何可以从这种无响应状态恢复CPU的例程?

2 个答案:

答案 0 :(得分:1)

首先,为了成功从低压中获益,每次降低电压(例如5-10 mV之间)非常重要。然后,在每个还原步骤之后,应检查对一个或多个硬件错误度量标准的更改(通常是CPU高速缓存错误率)。通常情况是,当电压缓慢下降时,误差率应逐渐增加。但是,在某些时候,将发生无法通过ECC(或处理器正在使用的任何硬件校正机制)纠正的错误。这是执行变得不可靠的时候。 Linux通过恐慌来响应此类错误(系统将自动重启或仅挂起)。因此,您可能仍然有机会检测到错误并选择继续执行,但即使您立即增加电压,也不能保证正确性。所以这将是一件非常非常危险的事情。它可以很快变得非常讨厌。当您处理其他错误时可能会发生错误(可能是由于处理错误的代码,因此最安全的做法是中止,请参阅Peter's comment)。

现代处理器提供配置和处理可纠正和不可纠正的硬件错误的机制。特别是,x86提供了机器检查架构(MCA)。默认情况下,在Linux中,当发生无法校正的机器检查时,会调用机器检查异常处理程序,这可能会中止系统(尽管它会尝试查看它是否可以安全地以某种方式恢复)。如果不使用其他工具,则无法在用户模式下处理。

以下是Linux支持的不同x86 MCE tolerance levels

struct mca_config mca_cfg __read_mostly = {
    .bootlog  = -1,
    /*
     * Tolerant levels:
     * 0: always panic on uncorrected errors, log corrected errors
     * 1: panic or SIGBUS on uncorrected errors, log corrected errors
     * 2: SIGBUS or log uncorrected errors (if possible), log corr. errors
     * 3: never panic or SIGBUS, log all errors (for testing only)
     */
    .tolerant = 1,
    .monarch_timeout = -1
};

请注意,默认tolerant值为1.但由于您正在修改内核,因此可以通过更改tolerant级别或处理代码本身来更改Linux处理MCE的方式。您可以开始使用machine_check_polldo_machine_check函数。

可以让您分析并可能响应机器检查的用户模式工具包括mcelogmcedaemon。 MCA将在英特尔手册的第3卷第15章和第16章中讨论。对于ARM,您还可以按照here中的讨论配置缓存ECC错误。

非常重要的是要理解,当降低电压超过标称值时,同一芯片的不同内核可能表现不同。这是由于工艺变化造成的。因此,不要假设电压降低可以在同一芯片的核心或芯片上工作。您将不得不在每个芯片的每个核心上测试它(如果您有多个插槽)。

  

我已经尝试过使用函数cpu_up和cpu_down,希望能够提问   内核恢复CPU,但无济于事。

这些功能是Hotplug CPU基础架构的一部分。这里不太有用。

答案 1 :(得分:0)

答案取决于CPU。我的答案仅限于x86_64和s390:

极端浪费本质上是拔掉CPU,为了能够恢复它,你必须确保配置CONFIG_HOTPLUG_CPU = y

此外,根据您使用的内核版本,您可能会有不同的拆卸或设置选项。如果您正在使用4.x,请查看<linux/cpuhotplug.h>中的cpuhp_ *例程,特别是 cpuhp_setup_state_multi may be the one you can use to set things up ... if in doubt look at cpuhp_setup_state_nocalls as well as __ cpuhp_setup_state` ...希望这会有所帮助:-)