aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_ondemand.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-02-17 20:28:24 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-09 08:41:08 -0500
commitd1db75fffc22504c586c3fae8d602384ea899340 (patch)
treecf2f6613ba88eb244162f8f1ad4fe8be05651ff4 /drivers/cpufreq/cpufreq_ondemand.c
parenta33cce1c6cc3268d8b4843bf1e4ac1e70b27d107 (diff)
cpufreq: ondemand: Rework the handling of powersave bias updates
The ondemand_powersave_bias_init() function used for resetting data fields related to the powersave bias tunable of the ondemand governor works by walking all of the online CPUs in the system and updating the od_cpu_dbs_info_s structures for all of them. However, if governor tunables are per policy, the update should not touch the CPUs that are not associated with the given dbs_data. Moreover, since the data fields in question are only ever used for policy->cpu in each policy governed by ondemand, the update can be limited to those specific CPUs. Rework the code to take the above observations into account. 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_ondemand.c')
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index 216ea442b835..43d89f6af206 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -34,14 +34,6 @@ static struct od_ops od_ops;
34 34
35static unsigned int default_powersave_bias; 35static unsigned int default_powersave_bias;
36 36
37static void ondemand_powersave_bias_init_cpu(int cpu)
38{
39 struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu);
40
41 dbs_info->freq_table = cpufreq_frequency_get_table(cpu);
42 dbs_info->freq_lo = 0;
43}
44
45/* 37/*
46 * Not all CPUs want IO time to be accounted as busy; this depends on how 38 * Not all CPUs want IO time to be accounted as busy; this depends on how
47 * efficient idling at a higher frequency/voltage is. 39 * efficient idling at a higher frequency/voltage is.
@@ -120,12 +112,13 @@ static unsigned int generic_powersave_bias_target(struct cpufreq_policy *policy,
120 return freq_hi; 112 return freq_hi;
121} 113}
122 114
123static void ondemand_powersave_bias_init(void) 115static void ondemand_powersave_bias_init(struct cpufreq_policy *policy)
124{ 116{
125 int i; 117 unsigned int cpu = policy->cpu;
126 for_each_online_cpu(i) { 118 struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu);
127 ondemand_powersave_bias_init_cpu(i); 119
128 } 120 dbs_info->freq_table = cpufreq_frequency_get_table(cpu);
121 dbs_info->freq_lo = 0;
129} 122}
130 123
131static void dbs_freq_increase(struct cpufreq_policy *policy, unsigned int freq) 124static void dbs_freq_increase(struct cpufreq_policy *policy, unsigned int freq)
@@ -306,6 +299,7 @@ static ssize_t store_powersave_bias(struct dbs_data *dbs_data, const char *buf,
306 size_t count) 299 size_t count)
307{ 300{
308 struct od_dbs_tuners *od_tuners = dbs_data->tuners; 301 struct od_dbs_tuners *od_tuners = dbs_data->tuners;
302 struct policy_dbs_info *policy_dbs;
309 unsigned int input; 303 unsigned int input;
310 int ret; 304 int ret;
311 ret = sscanf(buf, "%u", &input); 305 ret = sscanf(buf, "%u", &input);
@@ -317,7 +311,10 @@ static ssize_t store_powersave_bias(struct dbs_data *dbs_data, const char *buf,
317 input = 1000; 311 input = 1000;
318 312
319 od_tuners->powersave_bias = input; 313 od_tuners->powersave_bias = input;
320 ondemand_powersave_bias_init(); 314
315 list_for_each_entry(policy_dbs, &dbs_data->policy_dbs_list, list)
316 ondemand_powersave_bias_init(policy_dbs->policy);
317
321 return count; 318 return count;
322} 319}
323 320
@@ -398,11 +395,10 @@ static void od_exit(struct dbs_data *dbs_data, bool notify)
398 395
399static void od_start(struct cpufreq_policy *policy) 396static void od_start(struct cpufreq_policy *policy)
400{ 397{
401 unsigned int cpu = policy->cpu; 398 struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, policy->cpu);
402 struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu);
403 399
404 dbs_info->sample_type = OD_NORMAL_SAMPLE; 400 dbs_info->sample_type = OD_NORMAL_SAMPLE;
405 ondemand_powersave_bias_init_cpu(cpu); 401 ondemand_powersave_bias_init(policy);
406} 402}
407 403
408define_get_cpu_dbs_routines(od_cpu_dbs_info); 404define_get_cpu_dbs_routines(od_cpu_dbs_info);