深入解析linux cpu hotplug
說明:
Kernel版本:4.14
ARM64處理器
使用工具:Source Insight 3.5, Visio
1. 介紹
Linux CPU熱插拔,支持在系統(tǒng)啟動后,關(guān)閉任意一個secondary cpu
(在ARM架構(gòu)中,CPU0為boot cpu
,不能被關(guān)閉),并在需要時重新打開它。
CPU-hotplug
的一個用處是,支持SMP的Suspend
和Resume
,這個也是我看CPU-hotplug
的原因。
代碼路徑:include/linux/cpuhotplug.h
kernel/cpu.c
kernel/smpboot.c
arch/arm64/kernel/smp.c
2. 數(shù)據(jù)結(jié)構(gòu)
關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)有三種,如下圖所示:

struct cpuhp_cpu_state
:用來存儲hotplug的狀態(tài);enum cpuhp_state
:枚舉各種狀態(tài),這個會對應(yīng)到全局?jǐn)?shù)組中的某一項,而該項中會定義回調(diào)函數(shù)。當(dāng)然,也可以通過函數(shù)接口來設(shè)置回調(diào)函數(shù)。struct cpuhp_step
:Hotplug state machine step,主要定義了函數(shù)指針,當(dāng)跳轉(zhuǎn)到某一個狀態(tài)時會回調(diào)。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?


3. 流程
Linux內(nèi)核會創(chuàng)建虛擬總線cpu_subsys
,每個CPU注冊的時候,都會掛載在該總線上,CPU的online和offline的操作,最終會回調(diào)到該總線上的函數(shù)。通過echo 0 > /sys/devices/system/cpu/cpu1/online
和echo 1 > /sys/devices/system/cpu/cpu1/online
來控制CPU的熱插拔。
看圖吧。
3.1 cpu_up

Kernel會為每個CPU都創(chuàng)建一個hotplug線程,執(zhí)行
teardown/startup
回調(diào)函數(shù);cpu_up的時候依賴底層的
__cpu_up
函數(shù)的實現(xiàn);
3.2 cpu_down

cpu_down的實際操作還是很復(fù)雜的,這種圖只畫了一部分,涉及到該CPU上的線程park,以及中斷migrate,clockevents清除,以及通知上層等,不再深入研究了;
cpu_down的時候依賴底層的
__cpu_die
和__cpu_disable
函數(shù)的實現(xiàn);
CPU的Hogplug框架,針對是各類CPU,是一個通用的處理模式,涉及的面很寬,后續(xù)如果要用到的時候再繼續(xù)研究。
原文作者:LoyenWang
