背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器 3. 使用工具:Source Insight 3.5, Visio 1. 介紹 Linux CPU熱插拔,支持在系統啟動後,關閉任意一個 (在ARM架構中,CPU0為 ,不能被關閉),併在需要時重新打開 ...
背景
Read the fucking source code!
--By 魯迅A picture is worth a thousand words.
--By 高爾基
說明:
- Kernel版本:4.14
- ARM64處理器
- 使用工具:Source Insight 3.5, Visio
1. 介紹
Linux CPU熱插拔,支持在系統啟動後,關閉任意一個secondary cpu
(在ARM架構中,CPU0為boot cpu
,不能被關閉),併在需要時重新打開它。
CPU-hotplug
的一個用處是,支持SMP的Suspend
和Resume
,這個也是我看CPU-hotplug
的原因。
代碼路徑:
include/linux/cpuhotplug.h
kernel/cpu.c
kernel/smpboot.c
arch/arm64/kernel/smp.c
2. 數據結構
關鍵的數據結構有三種,如下圖所示:
struct cpuhp_cpu_state
:用來存儲hotplug的狀態;enum cpuhp_state
:枚舉各種狀態,這個會對應到全局數組中的某一項,而該項中會定義回調函數。當然,也可以通過函數介面來設置回調函數。struct cpuhp_step
:Hotplug state machine step,主要定義了函數指針,當跳轉到某一個狀態時會回調。
3. 流程
Linux內核會創建虛擬匯流排cpu_subsys
,每個CPU註冊的時候,都會掛載在該匯流排上,CPU的online和offline的操作,最終會回調到該匯流排上的函數。通過echo 0 > /sys/devices/system/cpu/cpu1/online
和echo 1 > /sys/devices/system/cpu/cpu1/online
來控制CPU的熱插拔。
看圖吧。
3.1 cpu_up
- Kernel會為每個CPU都創建一個hotplug線程,執行
teardown/startup
回調函數; - cpu_up的時候依賴底層的
__cpu_up
函數的實現;
3.2 cpu_down
- cpu_down的實際操作還是很複雜的,這種圖只畫了一部分,涉及到該CPU上的線程park,以及中斷migrate,clockevents清除,以及通知上層等,不再深入研究了;
- cpu_down的時候依賴底層的
__cpu_die
和__cpu_disable
函數的實現;
CPU的Hogplug框架,針對是各類CPU,是一個通用的處理模式,涉及的面很寬,後續如果要用到的時候再繼續研究。