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。 可以通过 device-check 或 eject-request 将固件策略的更改通知操作系统。

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