From 4b5d54ed2a30d2e65ae9105bf142d5a13719a24c Mon Sep 17 00:00:00 2001 From: gatieme Date: Sun, 27 Nov 2016 13:31:07 +0800 Subject: [PATCH] =?UTF-8?q?linux-cpu=E5=8F=98=E9=A2=91=E8=8A=82=E8=83=BD?= =?UTF-8?q?=E5=AD=90=E7=B3=BB=E7=BB=9Fcpufreq...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02-cpufreq/01-description/README.md | 91 +++++++++++-------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/study/kernel/06-cpu/02-cpufreq/01-description/README.md b/study/kernel/06-cpu/02-cpufreq/01-description/README.md index a0393b2..ab3398e 100644 --- a/study/kernel/06-cpu/02-cpufreq/01-description/README.md +++ b/study/kernel/06-cpu/02-cpufreq/01-description/README.md @@ -246,7 +246,7 @@ cat /proc/cpuinfo ###2.3.1 cpufrequtils ------- -`cpufrequtils` 是内核中内置的 `cpufreq` 接口工具, 其代码位于[内核源代码目录tools/power/cpupower](带添加信息), 包括 性能评测工具 `bench`, 底层运行库 `lib`, 上层应用框架 `utils`. +`cpufrequtils` 是内核中内置的 `cpufreq` 接口工具, 其代码位于[内核源代码目录tools/power/cpupower](http://lxr.free-electrons.com/source/tools/power/cpupower/lib/cpufreq.h?v=4.8#L23), 包括 性能评测工具 `bench`, 底层运行库 `lib`, 上层应用框架 `utils`. 我们需要安装 `cpufrequtils`. 此软件是查看 `cpu` 当前频率以及修改频率、选择`cpu`、选择`cpu`运行方式的 @@ -402,48 +402,59 @@ sudo apt-get install gkrellm gkrellm-cpufreq #3 内核的 `cpufreq` 实现 ------- -3. cpufreq_policy + + +##3.1 cpufreq_policy +------- + 一种调频策略的各种限制条件的组合称之为policy, 代码中用cpufreq_policy这一数据结构来表示: -[cpp] view plain copy -struct cpufreq_policy { - - cpumask_var_t cpus; - cpumask_var_t related_cpus; - - unsigned int shared_type; - - unsigned int cpu; - unsigned int last_cpu; - - struct cpufreq_cpuinfo cpuinfo; - - unsigned int min; /* in kHz */ - unsigned int max; /* in kHz */ - unsigned int cur; - - unsigned int policy; - struct cpufreq_governor *governor; - void *governor_data; - - struct work_struct update; - - - struct cpufreq_real_policy user_policy; - - struct kobject kobj; - struct completion kobj_unregister; -}; + +```cpp +// http://lxr.free-electrons.com/source/include/linux/cpufreq.h?v=4.8#L65 +``` + 其中的各个字段的解释如下: -cpus和related_cpus 这两个都是cpumask_var_t变量, cpus表示的是这一policy控制之下的所有还出于online状态的cpu, 而related_cpus则是online和offline两者的合集. 主要是用于多个cpu使用同一种policy的情况, 实际上, 我们平常见到的大多数系统中都是这种情况:所有的cpu同时使用同一种policy. 我们需要related_cpus变量指出这个policy所管理的所有cpu编号. -cpu和last_cpu 虽然一种policy可以同时用于多个cpu, 但是通常一种policy只会由其中的一个cpu进行管理, cpu变量用于记录用于管理该policy的cpu编号, 而last_cpu则是上一次管理该policy的cpu编号(因为管理policy的cpu可能会被plug out, 这时候就要把管理工作迁移到另一个cpu上). -cpuinfo 保存cpu硬件所能支持的最大和最小的频率以及切换延迟信息. -min/max/cur 该policy下的可使用的最小频率, 最大频率和当前频率. -policy 该变量可以取以下两个值:CPUFREQ_POLICY_POWERSAVE和CPUFREQ_POLICY_PERFORMANCE, 该变量只有当调频驱动支持setpolicy回调函数的时候有效, 这时候由驱动根据policy变量的值来决定系统的工作频率或状态. 如果调频驱动(cpufreq_driver)支持target回调, 则频率由相应的governor来决定. -governor和governor_data 指向该policy当前使用的cpufreq_governor结构和它的上下文数据. governor是实现该policy的关键所在, 调频策略的逻辑由governor实现. -update 有时在中断上下文中需要更新policy, 需要利用该工作队列把实际的工作移到稍后的进程上下文中执行. -user_policy 有时候因为特殊的原因需要修改policy的参数, 比如溫度过高时, 最大可允许的运行频率可能会被降低, 为了在适当的时候恢复原有的运行参数, 需要使用user_policy保存原始的参数(min, max, policy, governor). -kobj 该policy在sysfs中对应的kobj的对象. + +| 字段 | 描述 | +|:---:|:----:| +| cpus, related_cpus和real_cpus | 这三个都是 `cpumask_var_t` 变量
`cpus`表示的是这一`policy`控制之下的所有还处于online状态的`cpu`;
`related_cpus`则是`online`和`offline`两者的合集;
`real_cpus`则是与当前策略相关的所有的被安装CPU的合集;

主要是用于多个`cpu`使用同一种`policy`的情况, 实际上, 我们平常见到的大多数系统中都是这种情况 : 所有的`cpu`同时使用同一种`policy`. 我们需要`related_cpus`变量指出这个`policy`所管理的所有`cpu`编号. | +| shared_type | ACPI: ANY or ALL affected CPUs should set cpufreq | +| cpu和last_cpu | 虽然一种`policy`可以同时用于多个`cpu`, 但是通常一种`policy`只会由其中的一个`cpu`进行管理, `cpu`变量用于记录用于管理该`policy`的`cpu`编号, 而`last_cpu`则是上一次管理该`policy`的`cpu`编号(因为管理`policy`的`cpu`可能会被`plug out`, 这时候就要把管理工作迁移到另一个`cpu`上). | +| clk | | +| cpuinfo | 保存cpu硬件所能支持的最大和最小的频率以及切换延迟信息. | +| min/max/cur | 该policy下的可使用的最小频率, 最大频率和当前频率 | +| resort_freq | | +| suspend_freq | | +| policy和last_policy | | +| governor, governor_data和last_governor |指向该policy当前使用的cpufreq_governor结构和它的上下文数据. governor是实现该policy的关键所在, 调频策略的逻辑由governor实现.last_governor则缓存了之前所使用的策略信息 | +| update |有时在中断上下文中需要更新policy, 需要利用该工作队列把实际的工作移到稍后的进程上下文中执行. | +| user_policy | 有时候因为特殊的原因需要修改policy的参数, 比如溫度过高时, 最大可允许的运行频率可能会被降低, 为了在适当的时候恢复原有的运行参数, 需要使用user_policy保存原始的参数(min, max, policy, governor). | +| freq_table | +| freq_table_sorted | +| policy_list | +| kobj |该policy在sysfs中对应的kobj的对象. | +| kobj_unregister | | +| rwsem | | +| fast_switch_possible和 fast_switch_enabled | +| +| transition_ongoing | | +| transition_lock | | +| transition_wait | | +| transition_task | | +| stats | | +| driver_data | | + + +该变量可以取以下两个值, 该变量只有当调频驱动支持`setpolicy`回调函数的时候有效, 这时候由驱动根据`policy`变量的值来决定系统的工作频率或状态. 如果调频驱动(`cpufreq_driver`)支持`target`回调, 则频率由相应的`governor`来决定. + + +| 值 | 描述 | +|:--:|:---:| +| CPUFREQ_POLICY_POWERSAVE | | +| CPUFREQ_POLICY_PERFORMANCE | | + + 4. cpufreq_governor 所谓的governor, 我把它翻译成:调节器. governor负责检测cpu的使用状况, 从而在可用的范围中选择一个合适的频率, 代码中它用cpufreq_governor结构来表示: