aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_conservative.c
diff options
context:
space:
mode:
authorAlexander Clouter <alex@digriz.org.uk>2006-03-22 04:54:10 -0500
committerDominik Brodowski <linux@dominikbrodowski.net>2006-03-26 03:13:05 -0500
commit2c906b317b2d9c7e32b0d513e102bd68a2c49112 (patch)
treedcb86235f25d11e8662d75a9b185a7098cf17fd5 /drivers/cpufreq/cpufreq_conservative.c
parent36ddf5bbdea7ba4582abc62f106f0f0e9f0b6b91 (diff)
[PATCH] cpufreq_conservative: aligning of codebase with ondemand
Since the conservative govenor was released its codebase has drifted from the the direction and updates that have been applied to the ondemand govornor. This patch addresses the lack of updates in that period and brings conservative back up to date. The resulting diff file between cpufreq_ondemand.c and cpufreq_conservative.c is now much smaller and shows more clearly the differences between the two. Another reason to do this is ages ago, knowingly, I did a piss poor attempt at making conservative less responsive by knocking up DEF_SAMPLING_RATE_LATENCY_MULTIPLIER by two orders of magnitude. I did fix this ages ago but in my dis-organisation I must have toasted the diff and left it the way it was. About two weeks ago a user contacted me saying he was having problems with the conservative governor with his AMD Athlon XP-M 2800+ as /sys/devices/system/cpu/cpu0/cpufreq/conservative showed sampling_rate_min 9950000 sampling_rate_max 1360065408 Nine seconds to decide about changing the frequency....not too responsive :) Signed-off-by: Alexander Clouter <alex-kernel@digriz.org.uk> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/cpufreq/cpufreq_conservative.c')
-rw-r--r--drivers/cpufreq/cpufreq_conservative.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index ac38766b2583..adecd31f6156 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -35,12 +35,7 @@
35 */ 35 */
36 36
37#define DEF_FREQUENCY_UP_THRESHOLD (80) 37#define DEF_FREQUENCY_UP_THRESHOLD (80)
38#define MIN_FREQUENCY_UP_THRESHOLD (0)
39#define MAX_FREQUENCY_UP_THRESHOLD (100)
40
41#define DEF_FREQUENCY_DOWN_THRESHOLD (20) 38#define DEF_FREQUENCY_DOWN_THRESHOLD (20)
42#define MIN_FREQUENCY_DOWN_THRESHOLD (0)
43#define MAX_FREQUENCY_DOWN_THRESHOLD (100)
44 39
45/* 40/*
46 * The polling frequency of this governor depends on the capability of 41 * The polling frequency of this governor depends on the capability of
@@ -53,10 +48,14 @@
53 * All times here are in uS. 48 * All times here are in uS.
54 */ 49 */
55static unsigned int def_sampling_rate; 50static unsigned int def_sampling_rate;
56#define MIN_SAMPLING_RATE (def_sampling_rate / 2) 51#define MIN_SAMPLING_RATE_RATIO (2)
52/* for correct statistics, we need at least 10 ticks between each measure */
53#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
54#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
57#define MAX_SAMPLING_RATE (500 * def_sampling_rate) 55#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
58#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (100000) 56#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
59#define DEF_SAMPLING_DOWN_FACTOR (5) 57#define DEF_SAMPLING_DOWN_FACTOR (1)
58#define MAX_SAMPLING_DOWN_FACTOR (10)
60#define TRANSITION_LATENCY_LIMIT (10 * 1000) 59#define TRANSITION_LATENCY_LIMIT (10 * 1000)
61 60
62static void do_dbs_timer(void *data); 61static void do_dbs_timer(void *data);
@@ -136,7 +135,7 @@ static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
136 unsigned int input; 135 unsigned int input;
137 int ret; 136 int ret;
138 ret = sscanf (buf, "%u", &input); 137 ret = sscanf (buf, "%u", &input);
139 if (ret != 1 ) 138 if (ret != 1 || input > MAX_SAMPLING_DOWN_FACTOR || input < 1)
140 return -EINVAL; 139 return -EINVAL;
141 140
142 mutex_lock(&dbs_mutex); 141 mutex_lock(&dbs_mutex);
@@ -173,8 +172,7 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
173 ret = sscanf (buf, "%u", &input); 172 ret = sscanf (buf, "%u", &input);
174 173
175 mutex_lock(&dbs_mutex); 174 mutex_lock(&dbs_mutex);
176 if (ret != 1 || input > MAX_FREQUENCY_UP_THRESHOLD || 175 if (ret != 1 || input > 100 || input < 0 ||
177 input < MIN_FREQUENCY_UP_THRESHOLD ||
178 input <= dbs_tuners_ins.down_threshold) { 176 input <= dbs_tuners_ins.down_threshold) {
179 mutex_unlock(&dbs_mutex); 177 mutex_unlock(&dbs_mutex);
180 return -EINVAL; 178 return -EINVAL;
@@ -194,8 +192,7 @@ static ssize_t store_down_threshold(struct cpufreq_policy *unused,
194 ret = sscanf (buf, "%u", &input); 192 ret = sscanf (buf, "%u", &input);
195 193
196 mutex_lock(&dbs_mutex); 194 mutex_lock(&dbs_mutex);
197 if (ret != 1 || input > MAX_FREQUENCY_DOWN_THRESHOLD || 195 if (ret != 1 || input > 100 || input < 0 ||
198 input < MIN_FREQUENCY_DOWN_THRESHOLD ||
199 input >= dbs_tuners_ins.up_threshold) { 196 input >= dbs_tuners_ins.up_threshold) {
200 mutex_unlock(&dbs_mutex); 197 mutex_unlock(&dbs_mutex);
201 return -EINVAL; 198 return -EINVAL;
@@ -337,7 +334,6 @@ static void dbs_check_cpu(int cpu)
337 */ 334 */
338 335
339 /* Check for frequency increase */ 336 /* Check for frequency increase */
340
341 idle_ticks = UINT_MAX; 337 idle_ticks = UINT_MAX;
342 for_each_cpu_mask(j, policy->cpus) { 338 for_each_cpu_mask(j, policy->cpus) {
343 unsigned int tmp_idle_ticks, total_idle_ticks; 339 unsigned int tmp_idle_ticks, total_idle_ticks;
@@ -357,7 +353,7 @@ static void dbs_check_cpu(int cpu)
357 /* Scale idle ticks by 100 and compare with up and down ticks */ 353 /* Scale idle ticks by 100 and compare with up and down ticks */
358 idle_ticks *= 100; 354 idle_ticks *= 100;
359 up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) * 355 up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) *
360 usecs_to_jiffies(dbs_tuners_ins.sampling_rate); 356 usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
361 357
362 if (idle_ticks < up_idle_ticks) { 358 if (idle_ticks < up_idle_ticks) {
363 down_skip[cpu] = 0; 359 down_skip[cpu] = 0;
@@ -398,6 +394,7 @@ static void dbs_check_cpu(int cpu)
398 struct cpu_dbs_info_s *j_dbs_info; 394 struct cpu_dbs_info_s *j_dbs_info;
399 395
400 j_dbs_info = &per_cpu(cpu_dbs_info, j); 396 j_dbs_info = &per_cpu(cpu_dbs_info, j);
397 /* Check for frequency decrease */
401 total_idle_ticks = j_dbs_info->prev_cpu_idle_up; 398 total_idle_ticks = j_dbs_info->prev_cpu_idle_up;
402 tmp_idle_ticks = total_idle_ticks - 399 tmp_idle_ticks = total_idle_ticks -
403 j_dbs_info->prev_cpu_idle_down; 400 j_dbs_info->prev_cpu_idle_down;
@@ -414,12 +411,14 @@ static void dbs_check_cpu(int cpu)
414 freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * 411 freq_down_sampling_rate = dbs_tuners_ins.sampling_rate *
415 dbs_tuners_ins.sampling_down_factor; 412 dbs_tuners_ins.sampling_down_factor;
416 down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) * 413 down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) *
417 usecs_to_jiffies(freq_down_sampling_rate); 414 usecs_to_jiffies(freq_down_sampling_rate);
418 415
419 if (idle_ticks > down_idle_ticks) { 416 if (idle_ticks > down_idle_ticks) {
420 /* if we are already at the lowest speed then break out early 417 /*
418 * if we are already at the lowest speed then break out early
421 * or if we 'cannot' reduce the speed as the user might want 419 * or if we 'cannot' reduce the speed as the user might want
422 * freq_step to be zero */ 420 * freq_step to be zero
421 */
423 if (requested_freq[cpu] == policy->min 422 if (requested_freq[cpu] == policy->min
424 || dbs_tuners_ins.freq_step == 0) 423 || dbs_tuners_ins.freq_step == 0)
425 return; 424 return;
@@ -434,9 +433,8 @@ static void dbs_check_cpu(int cpu)
434 if (requested_freq[cpu] < policy->min) 433 if (requested_freq[cpu] < policy->min)
435 requested_freq[cpu] = policy->min; 434 requested_freq[cpu] = policy->min;
436 435
437 __cpufreq_driver_target(policy, 436 __cpufreq_driver_target(policy, requested_freq[cpu],
438 requested_freq[cpu], 437 CPUFREQ_RELATION_H);
439 CPUFREQ_RELATION_H);
440 return; 438 return;
441 } 439 }
442} 440}
@@ -507,13 +505,16 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
507 if (dbs_enable == 1) { 505 if (dbs_enable == 1) {
508 unsigned int latency; 506 unsigned int latency;
509 /* policy latency is in nS. Convert it to uS first */ 507 /* policy latency is in nS. Convert it to uS first */
508 latency = policy->cpuinfo.transition_latency / 1000;
509 if (latency == 0)
510 latency = 1;
510 511
511 latency = policy->cpuinfo.transition_latency; 512 def_sampling_rate = latency *
512 if (latency < 1000)
513 latency = 1000;
514
515 def_sampling_rate = (latency / 1000) *
516 DEF_SAMPLING_RATE_LATENCY_MULTIPLIER; 513 DEF_SAMPLING_RATE_LATENCY_MULTIPLIER;
514
515 if (def_sampling_rate < MIN_STAT_SAMPLING_RATE)
516 def_sampling_rate = MIN_STAT_SAMPLING_RATE;
517
517 dbs_tuners_ins.sampling_rate = def_sampling_rate; 518 dbs_tuners_ins.sampling_rate = def_sampling_rate;
518 dbs_tuners_ins.ignore_nice = 0; 519 dbs_tuners_ins.ignore_nice = 0;
519 dbs_tuners_ins.freq_step = 5; 520 dbs_tuners_ins.freq_step = 5;