找回密码
 注册
关于网站域名变更的通知
查看: 334|回复: 1
打印 上一主题 下一主题

Linux动态频率调节系统CPUFreq之governor的初始化

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-11-22 09:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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 p
3 h7 s2 d) \/ o1 _) b1 T6 g
                                                                                        图 3.1  governor的初始化
: s! U8 z, l/ P3 E- r
4 e( z+ f9 |# Z% r' l
6 N: u4 F# o  ]  J. i/ u
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:46 , Processed in 0.218750 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表