diff options
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 44 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq_ondemand.c | 50 |
2 files changed, 41 insertions, 53 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index 7a74d175287b..06bfe1c572cd 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
@@ -42,27 +42,12 @@ | |||
42 | * this governor will not work. | 42 | * this governor will not work. |
43 | * All times here are in uS. | 43 | * All times here are in uS. |
44 | */ | 44 | */ |
45 | static unsigned int def_sampling_rate; | ||
46 | #define MIN_SAMPLING_RATE_RATIO (2) | 45 | #define MIN_SAMPLING_RATE_RATIO (2) |
47 | /* for correct statistics, we need at least 10 ticks between each measure */ | ||
48 | #define MIN_STAT_SAMPLING_RATE \ | ||
49 | (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10)) | ||
50 | #define MIN_SAMPLING_RATE \ | ||
51 | (def_sampling_rate / MIN_SAMPLING_RATE_RATIO) | ||
52 | /* Above MIN_SAMPLING_RATE will vanish with its sysfs file soon | ||
53 | * Define the minimal settable sampling rate to the greater of: | ||
54 | * - "HW transition latency" * 100 (same as default sampling / 10) | ||
55 | * - MIN_STAT_SAMPLING_RATE | ||
56 | * To avoid that userspace shoots itself. | ||
57 | */ | ||
58 | static unsigned int minimum_sampling_rate(void) | ||
59 | { | ||
60 | return max(def_sampling_rate / 10, MIN_STAT_SAMPLING_RATE); | ||
61 | } | ||
62 | 46 | ||
63 | /* This will also vanish soon with removing sampling_rate_max */ | 47 | static unsigned int min_sampling_rate; |
64 | #define MAX_SAMPLING_RATE (500 * def_sampling_rate) | 48 | |
65 | #define LATENCY_MULTIPLIER (1000) | 49 | #define LATENCY_MULTIPLIER (1000) |
50 | #define MIN_LATENCY_MULTIPLIER (100) | ||
66 | #define DEF_SAMPLING_DOWN_FACTOR (1) | 51 | #define DEF_SAMPLING_DOWN_FACTOR (1) |
67 | #define MAX_SAMPLING_DOWN_FACTOR (10) | 52 | #define MAX_SAMPLING_DOWN_FACTOR (10) |
68 | #define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) | 53 | #define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000) |
@@ -190,7 +175,7 @@ static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | |||
190 | current->comm); | 175 | current->comm); |
191 | print_once = 1; | 176 | print_once = 1; |
192 | } | 177 | } |
193 | return sprintf(buf, "%u\n", MAX_SAMPLING_RATE); | 178 | return sprintf(buf, "%u\n", -1U); |
194 | } | 179 | } |
195 | 180 | ||
196 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) | 181 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) |
@@ -202,7 +187,7 @@ static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) | |||
202 | "sysfs file is deprecated - used by: %s\n", current->comm); | 187 | "sysfs file is deprecated - used by: %s\n", current->comm); |
203 | print_once = 1; | 188 | print_once = 1; |
204 | } | 189 | } |
205 | return sprintf(buf, "%u\n", MIN_SAMPLING_RATE); | 190 | return sprintf(buf, "%u\n", min_sampling_rate); |
206 | } | 191 | } |
207 | 192 | ||
208 | #define define_one_ro(_name) \ | 193 | #define define_one_ro(_name) \ |
@@ -254,7 +239,7 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused, | |||
254 | return -EINVAL; | 239 | return -EINVAL; |
255 | 240 | ||
256 | mutex_lock(&dbs_mutex); | 241 | mutex_lock(&dbs_mutex); |
257 | dbs_tuners_ins.sampling_rate = max(input, minimum_sampling_rate()); | 242 | dbs_tuners_ins.sampling_rate = max(input, min_sampling_rate); |
258 | mutex_unlock(&dbs_mutex); | 243 | mutex_unlock(&dbs_mutex); |
259 | 244 | ||
260 | return count; | 245 | return count; |
@@ -601,11 +586,18 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
601 | if (latency == 0) | 586 | if (latency == 0) |
602 | latency = 1; | 587 | latency = 1; |
603 | 588 | ||
604 | def_sampling_rate = | 589 | /* |
605 | max(latency * LATENCY_MULTIPLIER, | 590 | * conservative does not implement micro like ondemand |
606 | MIN_STAT_SAMPLING_RATE); | 591 | * governor, thus we are bound to jiffes/HZ |
607 | 592 | */ | |
608 | dbs_tuners_ins.sampling_rate = def_sampling_rate; | 593 | min_sampling_rate = |
594 | MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10); | ||
595 | /* Bring kernel and HW constraints together */ | ||
596 | min_sampling_rate = max(min_sampling_rate, | ||
597 | MIN_LATENCY_MULTIPLIER * latency); | ||
598 | dbs_tuners_ins.sampling_rate = | ||
599 | max(min_sampling_rate, | ||
600 | latency * LATENCY_MULTIPLIER); | ||
609 | 601 | ||
610 | cpufreq_register_notifier( | 602 | cpufreq_register_notifier( |
611 | &dbs_cpufreq_notifier_block, | 603 | &dbs_cpufreq_notifier_block, |
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index e741c339df76..a235114c3d85 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); |
@@ -227,7 +213,7 @@ static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | |||
227 | current->comm); | 213 | current->comm); |
228 | print_once = 1; | 214 | print_once = 1; |
229 | } | 215 | } |
230 | return sprintf(buf, "%u\n", MAX_SAMPLING_RATE); | 216 | return sprintf(buf, "%u\n", -1U); |
231 | } | 217 | } |
232 | 218 | ||
233 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) | 219 | static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) |
@@ -240,7 +226,7 @@ static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf) | |||
240 | current->comm); | 226 | current->comm); |
241 | print_once = 1; | 227 | print_once = 1; |
242 | } | 228 | } |
243 | return sprintf(buf, "%u\n", MIN_SAMPLING_RATE); | 229 | return sprintf(buf, "%u\n", min_sampling_rate); |
244 | } | 230 | } |
245 | 231 | ||
246 | #define define_one_ro(_name) \ | 232 | #define define_one_ro(_name) \ |
@@ -274,7 +260,7 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused, | |||
274 | mutex_unlock(&dbs_mutex); | 260 | mutex_unlock(&dbs_mutex); |
275 | return -EINVAL; | 261 | return -EINVAL; |
276 | } | 262 | } |
277 | dbs_tuners_ins.sampling_rate = max(input, minimum_sampling_rate()); | 263 | dbs_tuners_ins.sampling_rate = max(input, min_sampling_rate); |
278 | mutex_unlock(&dbs_mutex); | 264 | mutex_unlock(&dbs_mutex); |
279 | 265 | ||
280 | return count; | 266 | return count; |
@@ -619,12 +605,12 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
619 | latency = policy->cpuinfo.transition_latency / 1000; | 605 | latency = policy->cpuinfo.transition_latency / 1000; |
620 | if (latency == 0) | 606 | if (latency == 0) |
621 | latency = 1; | 607 | latency = 1; |
622 | 608 | /* Bring kernel and HW constraints together */ | |
623 | def_sampling_rate = | 609 | min_sampling_rate = max(min_sampling_rate, |
624 | max(latency * LATENCY_MULTIPLIER, | 610 | MIN_LATENCY_MULTIPLIER * latency); |
625 | MIN_STAT_SAMPLING_RATE); | 611 | dbs_tuners_ins.sampling_rate = |
626 | 612 | max(min_sampling_rate, | |
627 | dbs_tuners_ins.sampling_rate = def_sampling_rate; | 613 | latency * LATENCY_MULTIPLIER); |
628 | } | 614 | } |
629 | dbs_timer_init(this_dbs_info); | 615 | dbs_timer_init(this_dbs_info); |
630 | 616 | ||
@@ -678,6 +664,16 @@ static int __init cpufreq_gov_dbs_init(void) | |||
678 | dbs_tuners_ins.up_threshold = MICRO_FREQUENCY_UP_THRESHOLD; | 664 | dbs_tuners_ins.up_threshold = MICRO_FREQUENCY_UP_THRESHOLD; |
679 | dbs_tuners_ins.down_differential = | 665 | dbs_tuners_ins.down_differential = |
680 | MICRO_FREQUENCY_DOWN_DIFFERENTIAL; | 666 | MICRO_FREQUENCY_DOWN_DIFFERENTIAL; |
667 | /* | ||
668 | * In no_hz/micro accounting case we set the minimum frequency | ||
669 | * not depending on HZ, but fixed (very low). The deferred | ||
670 | * timer might skip some samples if idle/sleeping as needed. | ||
671 | */ | ||
672 | min_sampling_rate = MICRO_FREQUENCY_MIN_SAMPLE_RATE; | ||
673 | } else { | ||
674 | /* For correct statistics, we need 10 ticks for each measure */ | ||
675 | min_sampling_rate = | ||
676 | MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10); | ||
681 | } | 677 | } |
682 | 678 | ||
683 | kondemand_wq = create_workqueue("kondemand"); | 679 | kondemand_wq = create_workqueue("kondemand"); |