CPU 热插拔和 ACPI¶
在 arm64 世界中,CPU 热插拔通常用于描述内核使用 PSCI 使 CPU 上线/下线。本文档是关于 ACPI 固件允许将启动期间不可用的 CPU 添加到系统中。
possible
和 present
指的是 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 方法重新发现系统的动态属性。