diff options
author | Elias Oltmanns <eo@nebensachen.de> | 2007-10-22 03:50:13 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2007-10-22 16:34:39 -0400 |
commit | a8d7c3bc2396aff14f9e920677072cb55b016040 (patch) | |
tree | a962a7dbbe578abeaa69ce3f76cd3eb3d59643bc /drivers | |
parent | c5829cd07ec4c08daa7ff91c821af9b2ac7748df (diff) |
[CPUFREQ] Make cpufreq_conservative handle out-of-sync events properly
Make cpufreq_conservative handle out-of-sync events properly
Currently, the cpufreq_conservative governor doesn't get notified when the
actual frequency the cpu is running at differs from what cpufreq thought it
was. As a result the cpu may stay at the maximum frequency after a s2ram /
resume cycle even though the system is idle.
Signed-off-by: Elias Oltmanns <eo@nebensachen.de>
Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index 4bd33ce8a6f3..57d02e990af3 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
@@ -116,6 +116,27 @@ static inline unsigned int get_cpu_idle_time(unsigned int cpu) | |||
116 | return ret; | 116 | return ret; |
117 | } | 117 | } |
118 | 118 | ||
119 | /* keep track of frequency transitions */ | ||
120 | static int | ||
121 | dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val, | ||
122 | void *data) | ||
123 | { | ||
124 | struct cpufreq_freqs *freq = data; | ||
125 | struct cpu_dbs_info_s *this_dbs_info = &per_cpu(cpu_dbs_info, | ||
126 | freq->cpu); | ||
127 | |||
128 | if (!this_dbs_info->enable) | ||
129 | return 0; | ||
130 | |||
131 | this_dbs_info->requested_freq = freq->new; | ||
132 | |||
133 | return 0; | ||
134 | } | ||
135 | |||
136 | static struct notifier_block dbs_cpufreq_notifier_block = { | ||
137 | .notifier_call = dbs_cpufreq_notifier | ||
138 | }; | ||
139 | |||
119 | /************************** sysfs interface ************************/ | 140 | /************************** sysfs interface ************************/ |
120 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | 141 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) |
121 | { | 142 | { |
@@ -511,6 +532,9 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
511 | dbs_tuners_ins.sampling_rate = def_sampling_rate; | 532 | dbs_tuners_ins.sampling_rate = def_sampling_rate; |
512 | 533 | ||
513 | dbs_timer_init(); | 534 | dbs_timer_init(); |
535 | cpufreq_register_notifier( | ||
536 | &dbs_cpufreq_notifier_block, | ||
537 | CPUFREQ_TRANSITION_NOTIFIER); | ||
514 | } | 538 | } |
515 | 539 | ||
516 | mutex_unlock(&dbs_mutex); | 540 | mutex_unlock(&dbs_mutex); |
@@ -525,9 +549,13 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
525 | * Stop the timerschedule work, when this governor | 549 | * Stop the timerschedule work, when this governor |
526 | * is used for first time | 550 | * is used for first time |
527 | */ | 551 | */ |
528 | if (dbs_enable == 0) | 552 | if (dbs_enable == 0) { |
529 | dbs_timer_exit(); | 553 | dbs_timer_exit(); |
530 | 554 | cpufreq_unregister_notifier( | |
555 | &dbs_cpufreq_notifier_block, | ||
556 | CPUFREQ_TRANSITION_NOTIFIER); | ||
557 | } | ||
558 | |||
531 | mutex_unlock(&dbs_mutex); | 559 | mutex_unlock(&dbs_mutex); |
532 | 560 | ||
533 | break; | 561 | break; |