cpu

    xiaoxiao2025-10-09  8

    我们以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.
    转载请注明原文地址: https://ju.6miu.com/read-1302973.html
    最新回复(0)