视 code 如诗词,勿要做无所谓的堆砌 .
/*
* 1. 我们先看一下该函数的领导梯队是怎么样的.
* 2. 该函数在cpufreq framework中起到的作用.
* 3. 实际的验证过程.
* 4. 该函数的不足指出.
*
* ok. 该函数是static的, 它的直接caller就在本文件中且就一个. cpufreq_online.
* 既然涉及到online、offline 那么就与cpu hotplug扯上关系了.
* cpufreq、cpu hotplug、cpu idle 共同组成了低功耗机制.
*
* 1. 注册cpufreq_driver、cpu online时这两个时机会调用该函数.
* 具体来说就是在初始化policy的时候来执行的.
* 调用流程很明显, 从cpufreq_list上找到同名的governor, 然后传递给该函数.
*/
static int cpufreq_set_policy(struct cpufreq_policy *policy,
struct cpufreq_governor *new_gov,
unsigned int new_pol)
{
struct cpufreq_policy_data new_data;
struct cpufreq_governor *old_gov;
int ret;
memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo));
new_data.freq_table = policy->freq_table;
new_data.cpu = policy->cpu;
/*
* PM QoS framework collects all the requests from users and provide us
* the final aggregated value here.
*/
new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN);
new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX);
pr_debug("setting new policy for CPU %u: %u - %u kHz\n",
new_data.cpu, new_data.min, new_data.max);
/*
* Verify that the CPU speed can be set within these limits and make sure
* that min <= max.
*/
ret = cpufreq_driver->verify(&new_data);
if (ret)
return ret;