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 方法重新發現系統的動態屬性。