【cpuidle】cpuidle overview
什么是cpuidle
- 基本了解
参考这些文章对cpuidle做一些基本了解
http://www.wowotech.net/pm_subsystem/cpuidle_overview.html
https://blog.csdn.net/feelabclihu/article/details/125688355 - 概况总结
ACPI中定义了不同的processor state,称为c state,也就是core的状态。不同的c state有不同的特性(功耗、唤醒延时),功耗越低唤醒延时越大。C0代表运行态,C1、C2、CX是具体的硬件实现,数字越大,睡眠程度越深。
cpuidle的进入退出流程
-
boot阶段
系统启动后,创建idle线程 -
runtime阶段
- 判断是否有任务调度
a. 如果有的话,就去做schedule调度 - 判断core有没有被offline,
a. 如果被offline,则执行cpu die相关流程 - 判断有没有使用cpuidle framework
a. 如果没有使用,则直接走default idle函数,执行wfi - 如果使用了cpuidle framework,那接下来要调用cpuidle_select(),获取target state
a. cpuidle_select(),根据当前使用的governor,根据系统的pm qos,预期驻留时间/唤醒延时,判断target state - call_cpuidle()调用注册的driver进入target state
a. driver主要做的事情是,在初始化时,从ACPI/DTS中获取c state信息;调用psci、pcc等协议和通信接口 - driver根据target state进入低功耗状态,有可能是idle、retention、shutdown等状态
a. 如果是retention,会处于wfi,上下文不丢失,唤醒后执行下一条指令
b. 如果是shutdown,会重新走resume流程
cpuidle enter具体分析
Reference
- kernel doc https://www.kernel.org/doc/html/v5.0/admin-guide/pm/cpuidle.html
- cpuidle参数调优 https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/cpuidle
- ARM服务器LPI/CPPC适配 https://developer.arm.com/documentation/den0048/latest
- 进入、退出和最小驻留时间概念 https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/idle-states.txt