cpu_freq之注册governor.
2016-08-15 15:23
288 查看
我们以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.
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.
相关文章推荐
- Linux动态频率调节系统CPUFreq之三:governor
- cpu_freq之切换governor.
- Linux动态频率调节系统CPUFreq之三:governor
- linux cpufreq framework(4)_cpufreq governor
- Linux动态频率调节系统CPUFreq之三:governor
- linux cpufreq framework(4)_cpufreq governor
- Linux动态频率调节系统CPUFreq之三:governor
- Linux动态频率调节系统CPUFreq之三:governor
- About cpu freq governor fixing for periodic
- Linux动态频率调节系统CPUFreq之三:governor
- Linux动态频率调节系统CPUFreq之三:governor
- Linux动态频率调节系统CPUFreq之三:governor
- Linux动态调频系统CPUFreq之三:governor
- Linux动态频率调节系统CPUFreq之三:governor
- cpufreq动态频率调节(Sofia3GR)浅析及应用层APK实现
- Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
- Linux动态频率调节系统CPUFreq
- Linux功耗管理(21)_Linux cpuidle framework(4)_menu governor
- Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客
- [知其然不知其所以然-8] linux cpufreq的sysfs文件详细解释