diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq_ondemand.c')
-rw-r--r-- | drivers/cpufreq/cpufreq_ondemand.c | 68 |
1 files changed, 25 insertions, 43 deletions
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index e741c339df76..1911d1729353 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #define DEF_FREQUENCY_UP_THRESHOLD (80) | 32 | #define DEF_FREQUENCY_UP_THRESHOLD (80) |
33 | #define MICRO_FREQUENCY_DOWN_DIFFERENTIAL (3) | 33 | #define MICRO_FREQUENCY_DOWN_DIFFERENTIAL (3) |
34 | #define MICRO_FREQUENCY_UP_THRESHOLD (95) | 34 | #define MICRO_FREQUENCY_UP_THRESHOLD (95) |
35 | #define MICRO_FREQUENCY_MIN_SAMPLE_RATE (10000) | ||
35 | #define MIN_FREQUENCY_UP_THRESHOLD (11) | 36 | #define MIN_FREQUENCY_UP_THRESHOLD (11) |
36 | #define MAX_FREQUENCY_UP_THRESHOLD (100) | 37 | #define MAX_FREQUENCY_UP_THRESHOLD (100) |
37 | 38 | ||
@@ -45,27 +46,12 @@ | |||
45 | * this governor will not work. | 46 | * this governor will not work. |
46 | * All times here are in uS. | 47 | * All times here are in uS. |
47 | */ | 48 | */ |
48 | static unsigned int def_sampling_rate; | ||
49 | #define MIN_SAMPLING_RATE_RATIO (2) | 49 | #define MIN_SAMPLING_RATE_RATIO (2) |
50 | /* for correct statistics, we need at least 10 ticks between each measure */ | ||
51 | #define MIN_STAT_SAMPLING_RATE \ | ||
52 | (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10)) | ||
53 | #define MIN_SAMPLING_RATE \ | ||
54 | (def_sampling_rate / MIN_SAMPLING_RATE_RATIO) | ||
55 | /* Above MIN_SAMPLING_RATE will vanish with its sysfs file soon | ||
56 | * Define the minimal settable sampling rate to the greater of: | ||
57 | * - "HW transition latency" * 100 (same as default sampling / 10) | ||
58 | * - MIN_STAT_SAMPLING_RATE | ||
59 | * To avoid that userspace shoots itself. | ||
60 | */ | ||
61 | static unsigned int minimum_sampling_rate(void) | ||
62 | { | ||
63 | return max(def_sampling_rate / 10, MIN_STAT_SAMPLING_RATE); | ||
64 | } | ||
65 | 50 | ||
66 | /* This will also vanish soon with removing sampling_rate_max */ | 51 | static unsigned int min_sampling_rate; |
67 | #define MAX_SAMPLING_RATE (500 * def_sampling_rate) | 52 | |
68 | #define LATENCY_MULTIPLIER (1000) | 53 | #define LATENCY_MULTIPLIER (1000) |
54 | #define MIN_LATENCY_MULTIPLIER (100) | ||
69 | #define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) | 55 | #define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) |
70 | 56 | ||
71 | static void do_dbs_timer(struct work_struct *work); | 57 | static void do_dbs_timer(struct work_struct *work); |
@@ -219,28 +205,14 @@ static void ondemand_powersave_bias_init(void) | |||
219 | /************************** sysfs interface ************************/ | 205 | /************************** sysfs interface ************************/ |
220 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | 206 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) |
221 | { | 207 | { |
222 | static int print_once; | 208 | printk_once(KERN_INFO "CPUFREQ: ondemand sampling_rate_max " |
223 | 209 | "sysfs file is deprecated - used by: %s\n", current->comm); | |
224 | if (!print_once) { | 210 | return sprintf(buf, "%u\n", -1U); |
225 | printk(KERN_INFO "CPUFREQ: ondemand sampling_rate_max " | ||
226 | "sysfs file is deprecated - used by: %s\n", | ||
227 | current->comm); | ||
228 | print_once = 1; | ||
229 | } | ||
230 | return sprintf(buf, "%u\n", MAX_SAMPLING_RATE); | ||
231 | } | 211 | } |
232 | 212 | ||
233 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) | 213 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) |
234 | { | 214 | { |
235 | static int print_once; | 215 | return sprintf(buf, "%u\n", min_sampling_rate); |
236 | |||
237 | if (!print_once) { | ||
238 | printk(KERN_INFO "CPUFREQ: ondemand sampling_rate_min " | ||
239 | "sysfs file is deprecated - used by: %s\n", | ||
240 | current->comm); | ||
241 | print_once = 1; | ||
242 | } | ||
243 | return sprintf(buf, "%u\n", MIN_SAMPLING_RATE); | ||
244 | } | 216 | } |
245 | 217 | ||
246 | #define define_one_ro(_name) \ | 218 | #define define_one_ro(_name) \ |
@@ -274,7 +246,7 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused, | |||
274 | mutex_unlock(&dbs_mutex); | 246 | mutex_unlock(&dbs_mutex); |
275 | return -EINVAL; | 247 | return -EINVAL; |
276 | } | 248 | } |
277 | dbs_tuners_ins.sampling_rate = max(input, minimum_sampling_rate()); | 249 | dbs_tuners_ins.sampling_rate = max(input, min_sampling_rate); |
278 | mutex_unlock(&dbs_mutex); | 250 | mutex_unlock(&dbs_mutex); |
279 | 251 | ||
280 | return count; | 252 | return count; |
@@ -619,12 +591,12 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
619 | latency = policy->cpuinfo.transition_latency / 1000; | 591 | latency = policy->cpuinfo.transition_latency / 1000; |
620 | if (latency == 0) | 592 | if (latency == 0) |
621 | latency = 1; | 593 | latency = 1; |
622 | 594 | /* Bring kernel and HW constraints together */ | |
623 | def_sampling_rate = | 595 | min_sampling_rate = max(min_sampling_rate, |
624 | max(latency * LATENCY_MULTIPLIER, | 596 | MIN_LATENCY_MULTIPLIER * latency); |
625 | MIN_STAT_SAMPLING_RATE); | 597 | dbs_tuners_ins.sampling_rate = |
626 | 598 | max(min_sampling_rate, | |
627 | dbs_tuners_ins.sampling_rate = def_sampling_rate; | 599 | latency * LATENCY_MULTIPLIER); |
628 | } | 600 | } |
629 | dbs_timer_init(this_dbs_info); | 601 | dbs_timer_init(this_dbs_info); |
630 | 602 | ||
@@ -678,6 +650,16 @@ static int __init cpufreq_gov_dbs_init(void) | |||
678 | dbs_tuners_ins.up_threshold = MICRO_FREQUENCY_UP_THRESHOLD; | 650 | dbs_tuners_ins.up_threshold = MICRO_FREQUENCY_UP_THRESHOLD; |
679 | dbs_tuners_ins.down_differential = | 651 | dbs_tuners_ins.down_differential = |
680 | MICRO_FREQUENCY_DOWN_DIFFERENTIAL; | 652 | MICRO_FREQUENCY_DOWN_DIFFERENTIAL; |
653 | /* | ||
654 | * In no_hz/micro accounting case we set the minimum frequency | ||
655 | * not depending on HZ, but fixed (very low). The deferred | ||
656 | * timer might skip some samples if idle/sleeping as needed. | ||
657 | */ | ||
658 | min_sampling_rate = MICRO_FREQUENCY_MIN_SAMPLE_RATE; | ||
659 | } else { | ||
660 | /* For correct statistics, we need 10 ticks for each measure */ | ||
661 | min_sampling_rate = | ||
662 | MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10); | ||
681 | } | 663 | } |
682 | 664 | ||
683 | kondemand_wq = create_workqueue("kondemand"); | 665 | kondemand_wq = create_workqueue("kondemand"); |