当前位置: 移动技术网 > 科技>操作系统>Linux > 【原创】Linux cpu hotplug

【原创】Linux cpu hotplug

2019年08月23日  | 移动技术网科技  | 我要评论

背景

  • 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,是一个通用的处理模式,涉及的面很宽,后续如果要用到的时候再继续研究。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网