cpu_freq之注册governor.

我们以ondemand为例看看如何注册governor.
ondemand的初始化函数如下:可见是调用cpufreq_register_governor 来注册governor的
491 static int __init cpufreq_gov_dbs_init(void)
492 {
493         return cpufreq_register_governor(CPU_FREQ_GOV_ONDEMAND);
494 }
cpufreq_register_governor的实现如下:
2067行判断cpufreq_disabled是否是disable的,disable的时候当然不能注册了.
2060 int cpufreq_register_governor(struct cpufreq_governor *governor)
2061 {
2062         int err;
2063 
2064         if (!governor)
2065                 return -EINVAL;
2066 
2067         if (cpufreq_disabled())
2068                 return -ENODEV;
2069 
2070         mutex_lock(&cpufreq_governor_mutex);
2071 
2072         governor->initialized = 0;
2073         err = -EBUSY;
2074         if (!find_governor(governor->name)) {
2075                 err = 0;
2076                 list_add(&governor->governor_list, &cpufreq_governor_list);
2077         }
2078 
2079         mutex_unlock(&cpufreq_governor_mutex);
2080         return err;
2081 }
2082 EXPORT_SYMBOL_GPL(cpufreq_register_governor);
而cpufreq_disabled 只是返回off的值而已,如果off==1,则禁止注册governor.
111 static int cpufreq_disabled(void)
112 {
113         return off;
114 }
115 void disable_cpufreq(void)
116 {
117         off = 1;
118 }
2074行判断这个governor是否已经注册,是根据名字来判断是否注册的。
541 static struct cpufreq_governor *find_governor(const char *str_governor)
542 {
543         struct cpufreq_governor *t;
544 
545         for_each_governor(t)
546                 if (!strncasecmp(str_governor, t->name, CPUFREQ_NAME_LEN))
547                         return t;
548 
549         return NULL;
550 }
可见会去cpufreq_governor_list列表中找是否有已经注册的governor的名字和即将注册的governor的名字是否相等,如果相等则取消注册,这样可以避免重复注册。


再来看cpufreq_register_governor的2076行,如果没有注册这个governor,则将这个governor添加到cpufreq_governor_list,这里也可能证明系统是可以有多个governor的,可以主动在user space或者kernel 选择governor.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值