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
。 可以通过 device-check 或 eject-request 将固件策略的更改通知操作系统。
在静态表中描述为 enabled
的 CPU 不应由固件动态修改其 _STA。 软重启功能(如 kexec)将从这些静态表中重新读取系统的静态属性,如果这些属性不再描述正在运行的系统,则可能会发生故障。 Linux 将在启动期间稍后从 _STA 方法重新发现系统的动态属性。