diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-02-20 18:51:27 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-03-09 08:41:09 -0500 |
commit | 8c8f77fd0719a079450f59debed4f69ede825adb (patch) | |
tree | 6e1370e23065e3243f2677742ca479771e39e843 /drivers/cpufreq/cpufreq_governor.c | |
parent | 7d5a9956af4ccf7d5cc0cd1f8d27d1691321bfc6 (diff) |
cpufreq: governor: Move per-CPU data to the common code
After previous changes there is only one piece of code in the
ondemand governor making references to per-CPU data structures,
but it can be easily modified to avoid doing that, so modify it
accordingly and move the definition of per-CPU data used by the
ondemand and conservative governors to the common code. Next,
change that code to access the per-CPU data structures directly
rather than via a governor callback.
This causes the ->get_cpu_cdbs governor callback to become
unnecessary, so drop it along with the macro and function
definitions related to it.
Finally, drop the definitions of struct od_cpu_dbs_info_s and
struct cs_cpu_dbs_info_s that aren't necessary any more.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers/cpufreq/cpufreq_governor.c')
-rw-r--r-- | drivers/cpufreq/cpufreq_governor.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 6cbc846e3981..75217b850d7b 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c | |||
@@ -22,6 +22,8 @@ | |||
22 | 22 | ||
23 | #include "cpufreq_governor.h" | 23 | #include "cpufreq_governor.h" |
24 | 24 | ||
25 | static DEFINE_PER_CPU(struct cpu_dbs_info, cpu_dbs); | ||
26 | |||
25 | DEFINE_MUTEX(dbs_data_mutex); | 27 | DEFINE_MUTEX(dbs_data_mutex); |
26 | EXPORT_SYMBOL_GPL(dbs_data_mutex); | 28 | EXPORT_SYMBOL_GPL(dbs_data_mutex); |
27 | 29 | ||
@@ -82,7 +84,6 @@ EXPORT_SYMBOL_GPL(store_sampling_rate); | |||
82 | 84 | ||
83 | /** | 85 | /** |
84 | * gov_update_cpu_data - Update CPU load data. | 86 | * gov_update_cpu_data - Update CPU load data. |
85 | * @gov: Governor whose data is to be updated. | ||
86 | * @dbs_data: Top-level governor data pointer. | 87 | * @dbs_data: Top-level governor data pointer. |
87 | * | 88 | * |
88 | * Update CPU load data for all CPUs in the domain governed by @dbs_data | 89 | * Update CPU load data for all CPUs in the domain governed by @dbs_data |
@@ -91,7 +92,7 @@ EXPORT_SYMBOL_GPL(store_sampling_rate); | |||
91 | * | 92 | * |
92 | * Call under the @dbs_data mutex. | 93 | * Call under the @dbs_data mutex. |
93 | */ | 94 | */ |
94 | void gov_update_cpu_data(struct dbs_governor *gov, struct dbs_data *dbs_data) | 95 | void gov_update_cpu_data(struct dbs_data *dbs_data) |
95 | { | 96 | { |
96 | struct policy_dbs_info *policy_dbs; | 97 | struct policy_dbs_info *policy_dbs; |
97 | 98 | ||
@@ -99,7 +100,7 @@ void gov_update_cpu_data(struct dbs_governor *gov, struct dbs_data *dbs_data) | |||
99 | unsigned int j; | 100 | unsigned int j; |
100 | 101 | ||
101 | for_each_cpu(j, policy_dbs->policy->cpus) { | 102 | for_each_cpu(j, policy_dbs->policy->cpus) { |
102 | struct cpu_dbs_info *j_cdbs = gov->get_cpu_cdbs(j); | 103 | struct cpu_dbs_info *j_cdbs = &per_cpu(cpu_dbs, j); |
103 | 104 | ||
104 | j_cdbs->prev_cpu_idle = get_cpu_idle_time(j, &j_cdbs->prev_cpu_wall, | 105 | j_cdbs->prev_cpu_idle = get_cpu_idle_time(j, &j_cdbs->prev_cpu_wall, |
105 | dbs_data->io_is_busy); | 106 | dbs_data->io_is_busy); |
@@ -164,7 +165,6 @@ static const struct sysfs_ops governor_sysfs_ops = { | |||
164 | 165 | ||
165 | unsigned int dbs_update(struct cpufreq_policy *policy) | 166 | unsigned int dbs_update(struct cpufreq_policy *policy) |
166 | { | 167 | { |
167 | struct dbs_governor *gov = dbs_governor_of(policy); | ||
168 | struct policy_dbs_info *policy_dbs = policy->governor_data; | 168 | struct policy_dbs_info *policy_dbs = policy->governor_data; |
169 | struct dbs_data *dbs_data = policy_dbs->dbs_data; | 169 | struct dbs_data *dbs_data = policy_dbs->dbs_data; |
170 | unsigned int ignore_nice = dbs_data->ignore_nice_load; | 170 | unsigned int ignore_nice = dbs_data->ignore_nice_load; |
@@ -187,13 +187,11 @@ unsigned int dbs_update(struct cpufreq_policy *policy) | |||
187 | 187 | ||
188 | /* Get Absolute Load */ | 188 | /* Get Absolute Load */ |
189 | for_each_cpu(j, policy->cpus) { | 189 | for_each_cpu(j, policy->cpus) { |
190 | struct cpu_dbs_info *j_cdbs; | 190 | struct cpu_dbs_info *j_cdbs = &per_cpu(cpu_dbs, j); |
191 | u64 cur_wall_time, cur_idle_time; | 191 | u64 cur_wall_time, cur_idle_time; |
192 | unsigned int idle_time, wall_time; | 192 | unsigned int idle_time, wall_time; |
193 | unsigned int load; | 193 | unsigned int load; |
194 | 194 | ||
195 | j_cdbs = gov->get_cpu_cdbs(j); | ||
196 | |||
197 | cur_idle_time = get_cpu_idle_time(j, &cur_wall_time, io_busy); | 195 | cur_idle_time = get_cpu_idle_time(j, &cur_wall_time, io_busy); |
198 | 196 | ||
199 | wall_time = cur_wall_time - j_cdbs->prev_cpu_wall; | 197 | wall_time = cur_wall_time - j_cdbs->prev_cpu_wall; |
@@ -268,14 +266,13 @@ void gov_set_update_util(struct policy_dbs_info *policy_dbs, | |||
268 | unsigned int delay_us) | 266 | unsigned int delay_us) |
269 | { | 267 | { |
270 | struct cpufreq_policy *policy = policy_dbs->policy; | 268 | struct cpufreq_policy *policy = policy_dbs->policy; |
271 | struct dbs_governor *gov = dbs_governor_of(policy); | ||
272 | int cpu; | 269 | int cpu; |
273 | 270 | ||
274 | gov_update_sample_delay(policy_dbs, delay_us); | 271 | gov_update_sample_delay(policy_dbs, delay_us); |
275 | policy_dbs->last_sample_time = 0; | 272 | policy_dbs->last_sample_time = 0; |
276 | 273 | ||
277 | for_each_cpu(cpu, policy->cpus) { | 274 | for_each_cpu(cpu, policy->cpus) { |
278 | struct cpu_dbs_info *cdbs = gov->get_cpu_cdbs(cpu); | 275 | struct cpu_dbs_info *cdbs = &per_cpu(cpu_dbs, cpu); |
279 | 276 | ||
280 | cpufreq_set_update_util_data(cpu, &cdbs->update_util); | 277 | cpufreq_set_update_util_data(cpu, &cdbs->update_util); |
281 | } | 278 | } |
@@ -398,7 +395,7 @@ static struct policy_dbs_info *alloc_policy_dbs_info(struct cpufreq_policy *poli | |||
398 | 395 | ||
399 | /* Set policy_dbs for all CPUs, online+offline */ | 396 | /* Set policy_dbs for all CPUs, online+offline */ |
400 | for_each_cpu(j, policy->related_cpus) { | 397 | for_each_cpu(j, policy->related_cpus) { |
401 | struct cpu_dbs_info *j_cdbs = gov->get_cpu_cdbs(j); | 398 | struct cpu_dbs_info *j_cdbs = &per_cpu(cpu_dbs, j); |
402 | 399 | ||
403 | j_cdbs->policy_dbs = policy_dbs; | 400 | j_cdbs->policy_dbs = policy_dbs; |
404 | j_cdbs->update_util.func = dbs_update_util_handler; | 401 | j_cdbs->update_util.func = dbs_update_util_handler; |
@@ -406,17 +403,15 @@ static struct policy_dbs_info *alloc_policy_dbs_info(struct cpufreq_policy *poli | |||
406 | return policy_dbs; | 403 | return policy_dbs; |
407 | } | 404 | } |
408 | 405 | ||
409 | static void free_policy_dbs_info(struct cpufreq_policy *policy, | 406 | static void free_policy_dbs_info(struct policy_dbs_info *policy_dbs, |
410 | struct dbs_governor *gov) | 407 | struct dbs_governor *gov) |
411 | { | 408 | { |
412 | struct cpu_dbs_info *cdbs = gov->get_cpu_cdbs(policy->cpu); | ||
413 | struct policy_dbs_info *policy_dbs = cdbs->policy_dbs; | ||
414 | int j; | 409 | int j; |
415 | 410 | ||
416 | mutex_destroy(&policy_dbs->timer_mutex); | 411 | mutex_destroy(&policy_dbs->timer_mutex); |
417 | 412 | ||
418 | for_each_cpu(j, policy->related_cpus) { | 413 | for_each_cpu(j, policy_dbs->policy->related_cpus) { |
419 | struct cpu_dbs_info *j_cdbs = gov->get_cpu_cdbs(j); | 414 | struct cpu_dbs_info *j_cdbs = &per_cpu(cpu_dbs, j); |
420 | 415 | ||
421 | j_cdbs->policy_dbs = NULL; | 416 | j_cdbs->policy_dbs = NULL; |
422 | j_cdbs->update_util.func = NULL; | 417 | j_cdbs->update_util.func = NULL; |
@@ -507,7 +502,7 @@ static int cpufreq_governor_init(struct cpufreq_policy *policy) | |||
507 | kfree(dbs_data); | 502 | kfree(dbs_data); |
508 | 503 | ||
509 | free_policy_dbs_info: | 504 | free_policy_dbs_info: |
510 | free_policy_dbs_info(policy, gov); | 505 | free_policy_dbs_info(policy_dbs, gov); |
511 | return ret; | 506 | return ret; |
512 | } | 507 | } |
513 | 508 | ||
@@ -538,7 +533,7 @@ static int cpufreq_governor_exit(struct cpufreq_policy *policy) | |||
538 | policy->governor_data = NULL; | 533 | policy->governor_data = NULL; |
539 | } | 534 | } |
540 | 535 | ||
541 | free_policy_dbs_info(policy, gov); | 536 | free_policy_dbs_info(policy_dbs, gov); |
542 | return 0; | 537 | return 0; |
543 | } | 538 | } |
544 | 539 | ||
@@ -561,7 +556,7 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy) | |||
561 | io_busy = dbs_data->io_is_busy; | 556 | io_busy = dbs_data->io_is_busy; |
562 | 557 | ||
563 | for_each_cpu(j, policy->cpus) { | 558 | for_each_cpu(j, policy->cpus) { |
564 | struct cpu_dbs_info *j_cdbs = gov->get_cpu_cdbs(j); | 559 | struct cpu_dbs_info *j_cdbs = &per_cpu(cpu_dbs, j); |
565 | unsigned int prev_load; | 560 | unsigned int prev_load; |
566 | 561 | ||
567 | j_cdbs->prev_cpu_idle = get_cpu_idle_time(j, &j_cdbs->prev_cpu_wall, io_busy); | 562 | j_cdbs->prev_cpu_idle = get_cpu_idle_time(j, &j_cdbs->prev_cpu_wall, io_busy); |