您的位置:首页 > 编程语言 > Go语言

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: