aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_governor.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-02-20 18:51:27 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-09 08:41:09 -0500
commit8c8f77fd0719a079450f59debed4f69ede825adb (patch)
tree6e1370e23065e3243f2677742ca479771e39e843 /drivers/cpufreq/cpufreq_governor.c
parent7d5a9956af4ccf7d5cc0cd1f8d27d1691321bfc6 (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.c31
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
25static DEFINE_PER_CPU(struct cpu_dbs_info, cpu_dbs);
26
25DEFINE_MUTEX(dbs_data_mutex); 27DEFINE_MUTEX(dbs_data_mutex);
26EXPORT_SYMBOL_GPL(dbs_data_mutex); 28EXPORT_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 */
94void gov_update_cpu_data(struct dbs_governor *gov, struct dbs_data *dbs_data) 95void 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
165unsigned int dbs_update(struct cpufreq_policy *policy) 166unsigned 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
409static void free_policy_dbs_info(struct cpufreq_policy *policy, 406static 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
509free_policy_dbs_info: 504free_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);