【原創】Linux cpu hotplug


背景

  • Read the fucking source code! --By 魯迅
  • A picture is worth a thousand words. --By 高爾基

說明:

  1. Kernel版本:4.14
  2. ARM64處理器
  3. 使用工具:Source Insight 3.5, Visio

1. 介紹

Linux CPU熱插拔,支持在系統啟動后,關閉任意一個secondary cpu(在ARM架構中,CPU0為boot cpu,不能被關閉),並在需要時重新打開它。

CPU-hotplug的一個用處是,支持SMP的SuspendResume,這個也是我看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/onlineecho 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,是一個通用的處理模式,涉及的面很寬,后續如果要用到的時候再繼續研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM