|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux动态频率调节系统CPUFreq之governor的启动
/ _$ n% i2 I6 b' t
6 z9 f( S$ E6 H; k! j核心层会通过__cpufreq_set_policy函数,通过CPUFREQ_GOV_POLICY_INIT参数,在公共层的API:cpufreq_governor_dbs中,完成了对governor的初始化工作,紧接着,__cpufreq_set_policy会通过CPUFREQ_GOV_START参数,和初始化governor的流程一样,最终会到达cpufreq_governor_dbs函数中,我们看看它是如何启动一个governor的:
4 a! o0 D! t; S0 g0 I6 a: q8 j
! w3 `$ V1 v! E/ t" H1 F8 Q; s- case CPUFREQ_GOV_START:
- if (!policy->cur)
- return -EINVAL;
- mutex_lock(&dbs_data->mutex);
- for_each_cpu(j, policy->cpus) {
- struct cpu_dbs_common_info *j_cdbs =
- dbs_data->cdata->get_cpu_cdbs(j);
- j_cdbs->cpu = j;
- j_cdbs->cur_policy = policy;
- j_cdbs->prev_cpu_idle = get_cpu_idle_time(j,
- &j_cdbs->prev_cpu_wall, io_busy);
- if (ignore_nice)
- j_cdbs->prev_cpu_nice =
- kcpustat_cpu(j).cpustat[CPUTIME_NICE];
- mutex_init(&j_cdbs->timer_mutex);
- INIT_DEFERRABLE_WORK(&j_cdbs->work,
- dbs_data->cdata->gov_dbs_timer);
- }
7 ^9 h/ v& b9 E, c$ Y- s / ^6 y1 L& V/ k- s0 z1 L% L ?
, R3 r% u! O/ q- Q1 B, l9 S* T* h3 l2 s4 a9 a
首先,遍历使用该policy的所有的处于online状态的cpu,针对每一个cpu,做以下动作:
3 _: E. x% Q. S8 n% T, U- 取出该cpu相关联的cpu_dbs_common_info结构指针,之前已经讨论过,governor定义了一个per_cpu变量来定义各个cpu所对应的cpu_dbs_common_info结构,通过common_dbs_data结构的回调函数可以获取该结构的指针。
- 初始化cpu_dbs_common_info结构的cpu,cur_policy,prev_cpu_idle,prev_cpu_wall,prev_cpu_nice字段,其中,prev_cpu_idle,prev_cpu_wall这两个字段会被以后的负载计算所使用。
- 为每个cpu初始化一个工作队列,工作队列的执行函数是common_dbs_data结构中的gov_dbs_timer字段所指向的回调函数,对于ondemand来说,该函数是:od_dbs_timer。这个工作队列会被按照设定好的采样率定期地被唤醒,进行cpu负载的统计工作。
, R3 ~8 q8 X: U( Y2 I; p( T
2 \# x+ ]; d, @! j
/ |. V/ n! e# _9 i @3 b" x
4 e( s: t" [) B6 p# l
+ d: w* F! t! i+ d然后,记录目前的时间戳,调度初始化好的工作队列在稍后某个时间点运行:2 u) R+ }( m8 p
( m& H; e# r% Z' |* ]
- /* Initiate timer time stamp */
- cpu_cdbs->time_stamp = ktime_get();
- gov_queue_work(dbs_data, policy,
- delay_for_sampling_rate(sampling_rate), true);
. @2 V9 x* x0 s+ `/ H6 }& R
0 ` T2 N3 x" N m! ]1 L) |9 q3 q* n6 U+ J6 F" \8 I
, _ Y. @1 w& A' b" D* E下图表达了启动一个governor的过程:5 \# B( T4 ^( h+ Y0 R
9 a F# o, v; v z1 p- a5 i! S' S0 n3 w, N
( O. }0 t+ _, N5 b0 I( a- A
图 4.1 启动一个governor
( X4 i7 Q& P' w* ~9 Q/ F/ o3 k: H! k1 c
; O" c `& I3 j; t6 s工作队列被调度执行后,会在工作队列的执行函数中进行cpu负载的统计工作,这个我们在下一节中讨论。、1 v0 y$ x4 N! }* @
6 k& e" ~% n; J/ M4 g9 O; E
3 k8 s# G6 Y( v+ g2 D+ M+ d# B6 q
+ O' o# a/ q/ }) T) w/ S. P7 G
1 m* D$ I3 w: ~1 v
6 X, P( B. {7 r3 g) E7 Q4 a) v
6 N# |5 m9 y' p" S/ p+ b+ I
|
|