|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux动态频率调节系统CPUFreq之governor的初始化
2 s6 D8 ]0 b% N& d, J* H8 i O6 ~" x8 {7 [% b
当一个governor被policy选定后,核心层会通过__cpufreq_set_policy函数对该cpu的policy进行设定。如果policy认为这是一个新的governor(和原来使用的旧的governor不相同),policy会通过__cpufreq_governor函数,并传递CPUFREQ_GOV_POLICY_INIT参数,而__cpufreq_governor函数实际上是调用cpufreq_governor结构中的governor回调函数,在第2节中我们已经知道,这个回调最后会进入governor公共API:cpufreq_governor_dbs,下面是它收到CPUFREQ_GOV_POLICY_INIT参数时,经过简化后的代码片段:
, k: E7 h# R( }7 B; D
G: y' n5 e9 r2 N3 L- case CPUFREQ_GOV_POLICY_INIT:
- ......
- 0 Y2 d( s" Q# M- s- c+ K; L
- dbs_data = kzalloc(sizeof(*dbs_data), GFP_KERNEL);
- ......
8 V/ y! ~& I* v: D) n- dbs_data->cdata = cdata;
- dbs_data->usage_count = 1;
- rc = cdata->init(dbs_data);
- ......
( v2 s5 K* N- m5 K8 G- rc = sysfs_create_group(get_governor_parent_kobj(policy),
- get_sysfs_attr(dbs_data));
- ......
, D6 D$ I5 J; a( F2 F$ j# d, q; t9 i! i- policy->governor_data = dbs_data;
$ R& U$ {9 r" p/ \2 g" y# u- ......
- /* Bring kernel and HW constraints together */
- dbs_data->min_sampling_rate = max(dbs_data->min_sampling_rate,
- MIN_LATENCY_MULTIPLIER * latency);
- set_sampling_rate(dbs_data, max(dbs_data->min_sampling_rate,
- latency * LATENCY_MULTIPLIER));
- if ((cdata->governor == GOV_CONSERVATIVE) &&
- (!policy->governor->initialized)) {
- struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;
4 l' R5 F& Z2 J- cpufreq_register_notifier(cs_ops->notifier_block,
- CPUFREQ_TRANSITION_NOTIFIER);
- }
( x9 K$ S9 K0 w: I- if (!have_governor_per_policy())
- cdata->gdbs_data = dbs_data;
9 \+ h: r" K3 L4 x9 d3 r- return 0;
! q4 Q( k1 ~1 G% a7 Q2 l1 Q
& l* n7 B2 Z( `/ g+ z4 l( |1 r. m2 B/ n
首先,它会给这个policy分配一个dbs_data实例,然后把通过参数cdata传入的common_dbs_data指针,赋值给它的cdata字段,这样,policy就可以通过该字段获得governor的操作接口(通过cdata的一系列回调函数)。然后,调用cdata的init回调函数,对这个governor做进一步的初始化工作,对于ondemand来说,init回调的实际执行函数是:od_init,主要是完成和governor相关的一些调节参数的初始化,然后把初始化好的od_dbs_tuners结构指针赋值到dbs_data的tuners字段中,它的详细代码这里就不贴出了。接着,通过sysfs_create_group函数,建立该governor在sysfs中的节点,以后我们就可以通过这些节点对该governor的算法逻辑进行微调,ondemand在我的电脑中,建立了以下这些节点(sys/devices/system/cpu/cpufreq/ondemand):' p0 ~, \: I" q8 T4 J
9 `' M6 F% K+ [ y, U. ?: \7 V& s
sampling_rate;
4 y6 l& \- V) C: l; J7 }7 E) ?io_is_busy;% f2 C. M6 }* _1 b+ \" N5 s+ U
up_threshold;! y4 @/ f3 T+ Z, k; u Q p# K
sampling_down_factor;
( u' [% X) O! h$ b4 v5 pignore_nice;
; Y! x8 o8 x mpowersave_bias;0 ^# U* m: S: X, x! U
sampling_rate_min;* Y" w/ L8 f- S
8 \# U& k- \; l3 @0 ?
/ `2 _2 D/ Y! X9 K! L7 T9 s继续,把初始化好的dbs_data结构赋值给policy的governor_data字段,以方便以后的访问。最后是通过set_sampling_rate设置governor的采样周期,如果还有设置have_governor_per_policy,把dbs_data结构指针赋值给cdata结构的gdbs_data字段,至此,governor的初始化工作完成,下面是整个过程的序列图:5 z" n2 p3 _' l
% e& H$ P$ a5 f2 p3 h7 s2 d) \/ o1 _) b1 T6 g
图 3.1 governor的初始化
: s! U8 z, l/ P3 E- r4 e( z+ f9 |# Z% r' l
6 N: u4 F# o ] J. i/ u
|
|