aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-12 16:42:43 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-12 16:42:43 -0400
commit702ed6ef375c19d65f2eeeefd3851476f2c4cee4 (patch)
treefe46588dcc716f64a04310797d9446573614d3fc /drivers/cpufreq
parent2f41fc806434f8466bb361570589a3f6099ca65d (diff)
parent58a7295bc8073b9e668c329cb9ceb5b668c2b15d (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
* master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq: [CPUFREQ] Fix sysfs_create_file return value handling [CPUFREQ] ondemand: fix tickless accounting and software coordination bug [CPUFREQ] ondemand: add a check to avoid negative load calculation [CPUFREQ] Keep userspace governor quiet when it is not being used [CPUFREQ] Longhaul - Proper register access [CPUFREQ] Kconfig powernow-k8 driver should depend on ACPI P-States driver [CPUFREQ] Longhaul - Replace ACPI functions with direct I/O [CPUFREQ] Longhaul - Remove duplicate multipliers [CPUFREQ] Longhaul - Embedded "conservative" [CPUFREQ] acpi-cpufreq: Proper ReadModifyWrite of PERF_CTL MSR [CPUFREQ] check return value of sysfs_create_file [CPUFREQ] Longhaul - Check ACPI "BM DMA in progress" bit [CPUFREQ] Longhaul - Move old_ratio to correct place [CPUFREQ] Longhaul - VT8237 support [CPUFREQ] Longhaul - Use all kinds of support [CPUFREQ] powernow-k8: clarify number of cores.
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r--drivers/cpufreq/cpufreq.c18
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c30
-rw-r--r--drivers/cpufreq/cpufreq_userspace.c23
3 files changed, 54 insertions, 17 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index eb37fba9b7ef..0db9e1bda322 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -826,13 +826,21 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
826 /* set up files for this cpu device */ 826 /* set up files for this cpu device */
827 drv_attr = cpufreq_driver->attr; 827 drv_attr = cpufreq_driver->attr;
828 while ((drv_attr) && (*drv_attr)) { 828 while ((drv_attr) && (*drv_attr)) {
829 sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)); 829 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
830 if (ret)
831 goto err_out_driver_exit;
830 drv_attr++; 832 drv_attr++;
831 } 833 }
832 if (cpufreq_driver->get) 834 if (cpufreq_driver->get){
833 sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr); 835 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
834 if (cpufreq_driver->target) 836 if (ret)
835 sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr); 837 goto err_out_driver_exit;
838 }
839 if (cpufreq_driver->target){
840 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
841 if (ret)
842 goto err_out_driver_exit;
843 }
836 844
837 spin_lock_irqsave(&cpufreq_driver_lock, flags); 845 spin_lock_irqsave(&cpufreq_driver_lock, flags);
838 for_each_cpu_mask(j, policy->cpus) { 846 for_each_cpu_mask(j, policy->cpus) {
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index 8532bb79e5fc..e794527e4925 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -96,15 +96,25 @@ static struct dbs_tuners {
96 96
97static inline cputime64_t get_cpu_idle_time(unsigned int cpu) 97static inline cputime64_t get_cpu_idle_time(unsigned int cpu)
98{ 98{
99 cputime64_t retval; 99 cputime64_t idle_time;
100 cputime64_t cur_jiffies;
101 cputime64_t busy_time;
100 102
101 retval = cputime64_add(kstat_cpu(cpu).cpustat.idle, 103 cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
102 kstat_cpu(cpu).cpustat.iowait); 104 busy_time = cputime64_add(kstat_cpu(cpu).cpustat.user,
105 kstat_cpu(cpu).cpustat.system);
103 106
104 if (dbs_tuners_ins.ignore_nice) 107 busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
105 retval = cputime64_add(retval, kstat_cpu(cpu).cpustat.nice); 108 busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
109 busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);
106 110
107 return retval; 111 if (!dbs_tuners_ins.ignore_nice) {
112 busy_time = cputime64_add(busy_time,
113 kstat_cpu(cpu).cpustat.nice);
114 }
115
116 idle_time = cputime64_sub(cur_jiffies, busy_time);
117 return idle_time;
108} 118}
109 119
110/* 120/*
@@ -325,7 +335,7 @@ static struct attribute_group dbs_attr_group = {
325static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) 335static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
326{ 336{
327 unsigned int idle_ticks, total_ticks; 337 unsigned int idle_ticks, total_ticks;
328 unsigned int load; 338 unsigned int load = 0;
329 cputime64_t cur_jiffies; 339 cputime64_t cur_jiffies;
330 340
331 struct cpufreq_policy *policy; 341 struct cpufreq_policy *policy;
@@ -339,7 +349,8 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
339 cur_jiffies = jiffies64_to_cputime64(get_jiffies_64()); 349 cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
340 total_ticks = (unsigned int) cputime64_sub(cur_jiffies, 350 total_ticks = (unsigned int) cputime64_sub(cur_jiffies,
341 this_dbs_info->prev_cpu_wall); 351 this_dbs_info->prev_cpu_wall);
342 this_dbs_info->prev_cpu_wall = cur_jiffies; 352 this_dbs_info->prev_cpu_wall = get_jiffies_64();
353
343 if (!total_ticks) 354 if (!total_ticks)
344 return; 355 return;
345 /* 356 /*
@@ -370,7 +381,8 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
370 if (tmp_idle_ticks < idle_ticks) 381 if (tmp_idle_ticks < idle_ticks)
371 idle_ticks = tmp_idle_ticks; 382 idle_ticks = tmp_idle_ticks;
372 } 383 }
373 load = (100 * (total_ticks - idle_ticks)) / total_ticks; 384 if (likely(total_ticks > idle_ticks))
385 load = (100 * (total_ticks - idle_ticks)) / total_ticks;
374 386
375 /* Check for frequency increase */ 387 /* Check for frequency increase */
376 if (load > dbs_tuners_ins.up_threshold) { 388 if (load > dbs_tuners_ins.up_threshold) {
diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c
index a648970338b0..51bedab6c808 100644
--- a/drivers/cpufreq/cpufreq_userspace.c
+++ b/drivers/cpufreq/cpufreq_userspace.c
@@ -37,6 +37,7 @@ static unsigned int cpu_set_freq[NR_CPUS]; /* CPU freq desired by userspace */
37static unsigned int cpu_is_managed[NR_CPUS]; 37static unsigned int cpu_is_managed[NR_CPUS];
38 38
39static DEFINE_MUTEX (userspace_mutex); 39static DEFINE_MUTEX (userspace_mutex);
40static int cpus_using_userspace_governor;
40 41
41#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg) 42#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg)
42 43
@@ -47,7 +48,11 @@ userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
47{ 48{
48 struct cpufreq_freqs *freq = data; 49 struct cpufreq_freqs *freq = data;
49 50
50 dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", freq->cpu, freq->new); 51 if (!cpu_is_managed[freq->cpu])
52 return 0;
53
54 dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n",
55 freq->cpu, freq->new);
51 cpu_cur_freq[freq->cpu] = freq->new; 56 cpu_cur_freq[freq->cpu] = freq->new;
52 57
53 return 0; 58 return 0;
@@ -142,6 +147,13 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
142 if (rc) 147 if (rc)
143 goto start_out; 148 goto start_out;
144 149
150 if (cpus_using_userspace_governor == 0) {
151 cpufreq_register_notifier(
152 &userspace_cpufreq_notifier_block,
153 CPUFREQ_TRANSITION_NOTIFIER);
154 }
155 cpus_using_userspace_governor++;
156
145 cpu_is_managed[cpu] = 1; 157 cpu_is_managed[cpu] = 1;
146 cpu_min_freq[cpu] = policy->min; 158 cpu_min_freq[cpu] = policy->min;
147 cpu_max_freq[cpu] = policy->max; 159 cpu_max_freq[cpu] = policy->max;
@@ -153,6 +165,13 @@ start_out:
153 break; 165 break;
154 case CPUFREQ_GOV_STOP: 166 case CPUFREQ_GOV_STOP:
155 mutex_lock(&userspace_mutex); 167 mutex_lock(&userspace_mutex);
168 cpus_using_userspace_governor--;
169 if (cpus_using_userspace_governor == 0) {
170 cpufreq_unregister_notifier(
171 &userspace_cpufreq_notifier_block,
172 CPUFREQ_TRANSITION_NOTIFIER);
173 }
174
156 cpu_is_managed[cpu] = 0; 175 cpu_is_managed[cpu] = 0;
157 cpu_min_freq[cpu] = 0; 176 cpu_min_freq[cpu] = 0;
158 cpu_max_freq[cpu] = 0; 177 cpu_max_freq[cpu] = 0;
@@ -198,7 +217,6 @@ EXPORT_SYMBOL(cpufreq_gov_userspace);
198 217
199static int __init cpufreq_gov_userspace_init(void) 218static int __init cpufreq_gov_userspace_init(void)
200{ 219{
201 cpufreq_register_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
202 return cpufreq_register_governor(&cpufreq_gov_userspace); 220 return cpufreq_register_governor(&cpufreq_gov_userspace);
203} 221}
204 222
@@ -206,7 +224,6 @@ static int __init cpufreq_gov_userspace_init(void)
206static void __exit cpufreq_gov_userspace_exit(void) 224static void __exit cpufreq_gov_userspace_exit(void)
207{ 225{
208 cpufreq_unregister_governor(&cpufreq_gov_userspace); 226 cpufreq_unregister_governor(&cpufreq_gov_userspace);
209 cpufreq_unregister_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
210} 227}
211 228
212 229