aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_governor.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-02-14 20:15:50 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-09 08:41:03 -0500
commit679b8fe43a6b723787cae1d9599ed776d7ce238b (patch)
tree27f6c7625fc2baf59e660fe744a842a4ef44d1d4 /drivers/cpufreq/cpufreq_governor.c
parente4db2813d2e558b6b6bee464308678a57732b390 (diff)
cpufreq: governor: Fix nice contribution computation in dbs_check_cpu()
The contribution of the CPU nice time to the idle time in dbs_check_cpu() is computed in a bogus way, as the code may subtract current and previous nice values for different CPUs. That doesn't matter for cases when cpufreq policies are not shared, but may lead to problems otherwise. Fix the computation and simplify it to avoid taking unnecessary steps. 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.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index e5a08a13ca84..c5469701a3ef 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -198,22 +198,10 @@ void dbs_check_cpu(struct cpufreq_policy *policy)
198 j_cdbs->prev_cpu_idle = cur_idle_time; 198 j_cdbs->prev_cpu_idle = cur_idle_time;
199 199
200 if (ignore_nice) { 200 if (ignore_nice) {
201 struct cpu_dbs_info *cdbs = gov->get_cpu_cdbs(cpu); 201 u64 cur_nice = kcpustat_cpu(j).cpustat[CPUTIME_NICE];
202 u64 cur_nice;
203 unsigned long cur_nice_jiffies;
204 202
205 cur_nice = kcpustat_cpu(j).cpustat[CPUTIME_NICE] - 203 idle_time += cputime_to_usecs(cur_nice - j_cdbs->prev_cpu_nice);
206 cdbs->prev_cpu_nice; 204 j_cdbs->prev_cpu_nice = cur_nice;
207 /*
208 * Assumption: nice time between sampling periods will
209 * be less than 2^32 jiffies for 32 bit sys
210 */
211 cur_nice_jiffies = (unsigned long)
212 cputime64_to_jiffies64(cur_nice);
213
214 cdbs->prev_cpu_nice =
215 kcpustat_cpu(j).cpustat[CPUTIME_NICE];
216 idle_time += jiffies_to_usecs(cur_nice_jiffies);
217 } 205 }
218 206
219 if (unlikely(!wall_time || wall_time < idle_time)) 207 if (unlikely(!wall_time || wall_time < idle_time))