CPU 热插拔和 ACPI

在 arm64 世界中,CPU 热插拔通常用于描述内核使用 PSCI 使 CPU 上线/下线。本文档是关于 ACPI 固件允许将启动期间不可用的 CPU 添加到系统中。

possiblepresent 指的是 Linux 看到的 CPU 的状态。

物理系统上的 CPU 热插拔 - 启动时不存在的 CPU

物理系统需要将 possible 但不是 present 的 CPU 标记为 present。一个例子是双插槽机器,其中一个插槽中的封装可以在系统运行时更换。

不支持此操作。

在 arm64 世界中,CPU 不是单个设备,而是系统的一部分。没有系统支持在系统运行时物理添加(或删除)CPU,并且 ACPI 无法充分描述它们。

例如,新 CPU 带有新缓存,但平台的缓存拓扑结构在静态表 PPTT 中描述。CPU 之间如何共享缓存是无法发现的,必须由固件描述。

例如,每个 CPU 的 GIC 重分发器必须在启动期间由驱动程序访问,以发现系统范围支持的功能。ACPI 的 MADT GICC 结构可以描述与禁用 CPU 关联的重分发器,但不能描述重分发器是否可访问,只能描述它不是“始终开启”的。

arm64 的 ACPI 表假定描述的所有内容都是 present

虚拟系统上的 CPU 热插拔 - 启动时未启用的 CPU

虚拟系统的优势在于,系统将拥有的所有属性都可以在启动时描述。由于此类设备是模拟的,因此没有电源域的考虑因素。

支持虚拟系统上的 CPU 热插拔。它与物理 CPU 热插拔不同,因为所有资源都描述为 present,但 CPU 可能会被固件标记为已禁用。只有 CPU 的在线/离线行为受固件影响。一个示例是虚拟机以单个 CPU 启动,并且一旦云编排器部署工作负载,就会添加额外的 CPU。

对于虚拟机,VMM(例如 Qemu)充当固件的角色。

虚拟热插拔实现为影响哪些 CPU 可以上线的固件策略。固件可以通过 PSCI 的返回码来强制执行其策略。例如,DENIED

ACPI 表必须描述虚拟机的所有资源。固件希望从启动(或稍后)禁用的 CPU 不应在 MADT GICC 结构中 enabled,而应设置 online capable 位,以指示它们稍后可以启用。启动 CPU 必须标记为 enabled。“始终开启”GICR 结构必须用于描述重分发器。

描述为 online capable 但不是 enabled 的 CPU 可以通过 DSDT 的 Processor 对象的 _STA 方法设置为 enabled。在虚拟系统上,_STA 方法必须始终报告 CPU 为 present。可以通过设备检查或弹出请求将固件策略的更改通知给操作系统。

在静态表中描述为 enabled 的 CPU,不应由固件动态修改其 _STA。诸如 kexec 之类的软重启功能将从这些静态表中重新读取系统的静态属性,如果这些属性不再描述正在运行的系统,则可能会出现故障。Linux 将在启动后稍后从 _STA 方法重新发现系统的动态属性。