diff options
author | Xiaoguang Chen <chenxg@marvell.com> | 2013-11-06 21:28:50 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-11-07 13:36:19 -0500 |
commit | 3baa976ae644f76f5cdb5be0fb26754c3bfb32cb (patch) | |
tree | 5c571eb6bfb164a128c18050f310189275061159 /drivers/cpufreq | |
parent | fbbcdc0744dace5fcc8147d11c5fb0791126848a (diff) |
cpufreq: conservative: fix requested_freq reduction issue
When decreasing frequency, requested_freq may be less than
freq_target, So requested_freq minus freq_target may be negative,
But reqested_freq's unit is unsigned int, then the negative result
will be one larger interger which may be even higher than
requested_freq.
This patch is to fix such issue. when result becomes negative,
set requested_freq as the min value of policy.
Signed-off-by: Xiaoguang Chen <chenxg@marvell.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index f62d822048e6..218460fcd2e4 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
@@ -80,13 +80,18 @@ static void cs_check_cpu(int cpu, unsigned int load) | |||
80 | 80 | ||
81 | /* Check for frequency decrease */ | 81 | /* Check for frequency decrease */ |
82 | if (load < cs_tuners->down_threshold) { | 82 | if (load < cs_tuners->down_threshold) { |
83 | unsigned int freq_target; | ||
83 | /* | 84 | /* |
84 | * if we cannot reduce the frequency anymore, break out early | 85 | * if we cannot reduce the frequency anymore, break out early |
85 | */ | 86 | */ |
86 | if (policy->cur == policy->min) | 87 | if (policy->cur == policy->min) |
87 | return; | 88 | return; |
88 | 89 | ||
89 | dbs_info->requested_freq -= get_freq_target(cs_tuners, policy); | 90 | freq_target = get_freq_target(cs_tuners, policy); |
91 | if (dbs_info->requested_freq > freq_target) | ||
92 | dbs_info->requested_freq -= freq_target; | ||
93 | else | ||
94 | dbs_info->requested_freq = policy->min; | ||
90 | 95 | ||
91 | __cpufreq_driver_target(policy, dbs_info->requested_freq, | 96 | __cpufreq_driver_target(policy, dbs_info->requested_freq, |
92 | CPUFREQ_RELATION_L); | 97 | CPUFREQ_RELATION_L); |