【原创】Linux cpu hotplug
程序员文章站
2023-04-05 16:37:01
背景 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,是一个通用的处理模式,涉及的面很宽,后续如果要用到的时候再继续研究。