aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_ondemand.c
diff options
context:
space:
mode:
authorThomas Renninger <trenn@suse.de>2009-07-24 09:25:06 -0400
committerDave Jones <davej@redhat.com>2009-09-01 12:45:18 -0400
commit0e625ac153126a0a62b7635fa9dc91f87ff39e38 (patch)
tree121d8d681e1fc401f12c17d705de476739553002 /drivers/cpufreq/cpufreq_ondemand.c
parent8aa84ad8d6c740a04386f599694609ee4998e82e (diff)
[CPUFREQ] ondemand - Use global sysfs dir for tuning settings
Ondemand has only global variables for userspace tunings via sysfs. But they were exposed per CPU which wrongly implies to the user that his settings are applied per cpu. Also locking sysfs against concurrent access won't be necessary anymore after deprecation time. This means the ondemand config dir is moved: /sys/devices/system/cpu/cpu*/cpufreq/ondemand -> /sys/devices/system/cpu/cpufreq/ondemand The old files will still exist, but reading or writing to them will result in one (printk_once) deprecation msg to syslog per file. Signed-off-by: Thomas Renninger <trenn@suse.de> Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'drivers/cpufreq/cpufreq_ondemand.c')
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c139
1 files changed, 113 insertions, 26 deletions
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index d6ba14276bb1..1a3e5c7252ff 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -55,6 +55,18 @@ static unsigned int min_sampling_rate;
55#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) 55#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000)
56 56
57static void do_dbs_timer(struct work_struct *work); 57static void do_dbs_timer(struct work_struct *work);
58static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
59 unsigned int event);
60
61#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND
62static
63#endif
64struct cpufreq_governor cpufreq_gov_ondemand = {
65 .name = "ondemand",
66 .governor = cpufreq_governor_dbs,
67 .max_transition_latency = TRANSITION_LATENCY_LIMIT,
68 .owner = THIS_MODULE,
69};
58 70
59/* Sampling types */ 71/* Sampling types */
60enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE}; 72enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
@@ -206,20 +218,23 @@ static void ondemand_powersave_bias_init(void)
206} 218}
207 219
208/************************** sysfs interface ************************/ 220/************************** sysfs interface ************************/
209static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) 221
222static ssize_t show_sampling_rate_max(struct kobject *kobj,
223 struct attribute *attr, char *buf)
210{ 224{
211 printk_once(KERN_INFO "CPUFREQ: ondemand sampling_rate_max " 225 printk_once(KERN_INFO "CPUFREQ: ondemand sampling_rate_max "
212 "sysfs file is deprecated - used by: %s\n", current->comm); 226 "sysfs file is deprecated - used by: %s\n", current->comm);
213 return sprintf(buf, "%u\n", -1U); 227 return sprintf(buf, "%u\n", -1U);
214} 228}
215 229
216static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) 230static ssize_t show_sampling_rate_min(struct kobject *kobj,
231 struct attribute *attr, char *buf)
217{ 232{
218 return sprintf(buf, "%u\n", min_sampling_rate); 233 return sprintf(buf, "%u\n", min_sampling_rate);
219} 234}
220 235
221#define define_one_ro(_name) \ 236#define define_one_ro(_name) \
222static struct freq_attr _name = \ 237static struct global_attr _name = \
223__ATTR(_name, 0444, show_##_name, NULL) 238__ATTR(_name, 0444, show_##_name, NULL)
224 239
225define_one_ro(sampling_rate_max); 240define_one_ro(sampling_rate_max);
@@ -228,7 +243,7 @@ define_one_ro(sampling_rate_min);
228/* cpufreq_ondemand Governor Tunables */ 243/* cpufreq_ondemand Governor Tunables */
229#define show_one(file_name, object) \ 244#define show_one(file_name, object) \
230static ssize_t show_##file_name \ 245static ssize_t show_##file_name \
231(struct cpufreq_policy *unused, char *buf) \ 246(struct kobject *kobj, struct attribute *attr, char *buf) \
232{ \ 247{ \
233 return sprintf(buf, "%u\n", dbs_tuners_ins.object); \ 248 return sprintf(buf, "%u\n", dbs_tuners_ins.object); \
234} 249}
@@ -237,8 +252,38 @@ show_one(up_threshold, up_threshold);
237show_one(ignore_nice_load, ignore_nice); 252show_one(ignore_nice_load, ignore_nice);
238show_one(powersave_bias, powersave_bias); 253show_one(powersave_bias, powersave_bias);
239 254
240static ssize_t store_sampling_rate(struct cpufreq_policy *unused, 255/*** delete after deprecation time ***/
241 const char *buf, size_t count) 256
257#define DEPRECATION_MSG(file_name) \
258 printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
259 "interface is deprecated - " #file_name "\n");
260
261#define show_one_old(file_name) \
262static ssize_t show_##file_name##_old \
263(struct cpufreq_policy *unused, char *buf) \
264{ \
265 printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
266 "interface is deprecated - " #file_name "\n"); \
267 return show_##file_name(NULL, NULL, buf); \
268}
269show_one_old(sampling_rate);
270show_one_old(up_threshold);
271show_one_old(ignore_nice_load);
272show_one_old(powersave_bias);
273show_one_old(sampling_rate_min);
274show_one_old(sampling_rate_max);
275
276#define define_one_ro_old(object, _name) \
277static struct freq_attr object = \
278__ATTR(_name, 0444, show_##_name##_old, NULL)
279
280define_one_ro_old(sampling_rate_min_old, sampling_rate_min);
281define_one_ro_old(sampling_rate_max_old, sampling_rate_max);
282
283/*** delete after deprecation time ***/
284
285static ssize_t store_sampling_rate(struct kobject *a, struct attribute *b,
286 const char *buf, size_t count)
242{ 287{
243 unsigned int input; 288 unsigned int input;
244 int ret; 289 int ret;
@@ -253,8 +298,8 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused,
253 return count; 298 return count;
254} 299}
255 300
256static ssize_t store_up_threshold(struct cpufreq_policy *unused, 301static ssize_t store_up_threshold(struct kobject *a, struct attribute *b,
257 const char *buf, size_t count) 302 const char *buf, size_t count)
258{ 303{
259 unsigned int input; 304 unsigned int input;
260 int ret; 305 int ret;
@@ -272,8 +317,8 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
272 return count; 317 return count;
273} 318}
274 319
275static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy, 320static ssize_t store_ignore_nice_load(struct kobject *a, struct attribute *b,
276 const char *buf, size_t count) 321 const char *buf, size_t count)
277{ 322{
278 unsigned int input; 323 unsigned int input;
279 int ret; 324 int ret;
@@ -309,8 +354,8 @@ static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
309 return count; 354 return count;
310} 355}
311 356
312static ssize_t store_powersave_bias(struct cpufreq_policy *unused, 357static ssize_t store_powersave_bias(struct kobject *a, struct attribute *b,
313 const char *buf, size_t count) 358 const char *buf, size_t count)
314{ 359{
315 unsigned int input; 360 unsigned int input;
316 int ret; 361 int ret;
@@ -331,7 +376,7 @@ static ssize_t store_powersave_bias(struct cpufreq_policy *unused,
331} 376}
332 377
333#define define_one_rw(_name) \ 378#define define_one_rw(_name) \
334static struct freq_attr _name = \ 379static struct global_attr _name = \
335__ATTR(_name, 0644, show_##_name, store_##_name) 380__ATTR(_name, 0644, show_##_name, store_##_name)
336 381
337define_one_rw(sampling_rate); 382define_one_rw(sampling_rate);
@@ -354,6 +399,47 @@ static struct attribute_group dbs_attr_group = {
354 .name = "ondemand", 399 .name = "ondemand",
355}; 400};
356 401
402/*** delete after deprecation time ***/
403
404#define write_one_old(file_name) \
405static ssize_t store_##file_name##_old \
406(struct cpufreq_policy *unused, const char *buf, size_t count) \
407{ \
408 printk_once(KERN_INFO "CPUFREQ: Per core ondemand sysfs " \
409 "interface is deprecated - " #file_name "\n"); \
410 return store_##file_name(NULL, NULL, buf, count); \
411}
412write_one_old(sampling_rate);
413write_one_old(up_threshold);
414write_one_old(ignore_nice_load);
415write_one_old(powersave_bias);
416
417#define define_one_rw_old(object, _name) \
418static struct freq_attr object = \
419__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old)
420
421define_one_rw_old(sampling_rate_old, sampling_rate);
422define_one_rw_old(up_threshold_old, up_threshold);
423define_one_rw_old(ignore_nice_load_old, ignore_nice_load);
424define_one_rw_old(powersave_bias_old, powersave_bias);
425
426static struct attribute *dbs_attributes_old[] = {
427 &sampling_rate_max_old.attr,
428 &sampling_rate_min_old.attr,
429 &sampling_rate_old.attr,
430 &up_threshold_old.attr,
431 &ignore_nice_load_old.attr,
432 &powersave_bias_old.attr,
433 NULL
434};
435
436static struct attribute_group dbs_attr_group_old = {
437 .attrs = dbs_attributes_old,
438 .name = "ondemand",
439};
440
441/*** delete after deprecation time ***/
442
357/************************** sysfs end ************************/ 443/************************** sysfs end ************************/
358 444
359static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) 445static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
@@ -544,7 +630,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
544 630
545 mutex_lock(&dbs_mutex); 631 mutex_lock(&dbs_mutex);
546 632
547 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group); 633 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group_old);
548 if (rc) { 634 if (rc) {
549 mutex_unlock(&dbs_mutex); 635 mutex_unlock(&dbs_mutex);
550 return rc; 636 return rc;
@@ -565,13 +651,20 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
565 } 651 }
566 this_dbs_info->cpu = cpu; 652 this_dbs_info->cpu = cpu;
567 ondemand_powersave_bias_init_cpu(cpu); 653 ondemand_powersave_bias_init_cpu(cpu);
568 mutex_init(&this_dbs_info->timer_mutex);
569 /* 654 /*
570 * Start the timerschedule work, when this governor 655 * Start the timerschedule work, when this governor
571 * is used for first time 656 * is used for first time
572 */ 657 */
573 if (dbs_enable == 1) { 658 if (dbs_enable == 1) {
574 unsigned int latency; 659 unsigned int latency;
660
661 rc = sysfs_create_group(cpufreq_global_kobject,
662 &dbs_attr_group);
663 if (rc) {
664 mutex_unlock(&dbs_mutex);
665 return rc;
666 }
667
575 /* policy latency is in nS. Convert it to uS first */ 668 /* policy latency is in nS. Convert it to uS first */
576 latency = policy->cpuinfo.transition_latency / 1000; 669 latency = policy->cpuinfo.transition_latency / 1000;
577 if (latency == 0) 670 if (latency == 0)
@@ -585,6 +678,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
585 } 678 }
586 mutex_unlock(&dbs_mutex); 679 mutex_unlock(&dbs_mutex);
587 680
681 mutex_init(&this_dbs_info->timer_mutex);
588 dbs_timer_init(this_dbs_info); 682 dbs_timer_init(this_dbs_info);
589 break; 683 break;
590 684
@@ -592,10 +686,13 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
592 dbs_timer_exit(this_dbs_info); 686 dbs_timer_exit(this_dbs_info);
593 687
594 mutex_lock(&dbs_mutex); 688 mutex_lock(&dbs_mutex);
595 sysfs_remove_group(&policy->kobj, &dbs_attr_group); 689 sysfs_remove_group(&policy->kobj, &dbs_attr_group_old);
596 mutex_destroy(&this_dbs_info->timer_mutex); 690 mutex_destroy(&this_dbs_info->timer_mutex);
597 dbs_enable--; 691 dbs_enable--;
598 mutex_unlock(&dbs_mutex); 692 mutex_unlock(&dbs_mutex);
693 if (!dbs_enable)
694 sysfs_remove_group(cpufreq_global_kobject,
695 &dbs_attr_group);
599 696
600 break; 697 break;
601 698
@@ -613,16 +710,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
613 return 0; 710 return 0;
614} 711}
615 712
616#ifndef CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND
617static
618#endif
619struct cpufreq_governor cpufreq_gov_ondemand = {
620 .name = "ondemand",
621 .governor = cpufreq_governor_dbs,
622 .max_transition_latency = TRANSITION_LATENCY_LIMIT,
623 .owner = THIS_MODULE,
624};
625
626static int __init cpufreq_gov_dbs_init(void) 713static int __init cpufreq_gov_dbs_init(void)
627{ 714{
628 int err; 715 int err;