|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux动态频率调节系统CPUFreq之governor的启动
( j7 e, J0 v3 ^* M: ?* x- o# c* b+ T8 f7 B
核心层会通过__cpufreq_set_policy函数,通过CPUFREQ_GOV_POLICY_INIT参数,在公共层的API:cpufreq_governor_dbs中,完成了对governor的初始化工作,紧接着,__cpufreq_set_policy会通过CPUFREQ_GOV_START参数,和初始化governor的流程一样,最终会到达cpufreq_governor_dbs函数中,我们看看它是如何启动一个governor的:
, Y+ z% X: h# h8 s' C6 m& N- {7 ]6 `
/ O3 g3 G- C. j( @% L `% u3 O9 V- 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);
- }
" o% d5 L7 S9 N2 _8 p9 c; J ; Y9 J6 r" o2 x! l( Z w; r A$ \
2 u" ?! y1 d! Q5 u6 q2 s
$ Z4 P- {. ~ W% f: m首先,遍历使用该policy的所有的处于online状态的cpu,针对每一个cpu,做以下动作:+ L5 j. ?, d5 |
- 取出该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负载的统计工作。8 g9 \. x% j# Q( C
8 e; x( h+ r, i3 V, |- `5 z' n5 D# Z- n& l4 R, q; J
8 J% `8 l4 V8 h; [3 C) `- w$ q% ~5 M# F. T4 c
然后,记录目前的时间戳,调度初始化好的工作队列在稍后某个时间点运行:
3 R6 q& N ~+ ^9 B2 g( O4 P& Y6 s1 n7 Y
- /* Initiate timer time stamp */
- cpu_cdbs->time_stamp = ktime_get();
- gov_queue_work(dbs_data, policy,
- delay_for_sampling_rate(sampling_rate), true);7 f. d `; ^/ V P" c
: t: d& n: g% n( u R5 l
% ^4 p8 X3 o4 u
4 o7 F7 w& j( x0 r) `6 ~& c
下图表达了启动一个governor的过程:
4 k2 l# J: }8 M+ w0 |9 k3 |+ }) b; P4 a; W, @
7 K2 q; `/ |- H5 I# V& _& _
: `2 r6 h' u0 P Y' v
图 4.1 启动一个governor
1 K. Y7 Q) i7 c9 R
) Q1 U2 g# z3 ?: U- w/ J
9 S3 C* I3 b/ S/ W工作队列被调度执行后,会在工作队列的执行函数中进行cpu负载的统计工作,这个我们在下一节中讨论。、 ~7 H6 H/ v' u1 J7 T
# F" T3 A( W2 f/ o/ e. Y) c7 k- C) P5 i, }( C) z$ P0 n
/ P' Z0 I& C! F
: d$ Z! V5 u5 l$ w# y$ E; M4 z7 C) K) O9 `. ~6 u
7 D3 E+ v8 R0 l* y
) k' ?# {. W) Q, @# h
|
|