summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 7a262974b128..c18c20d5fe54 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -145,6 +145,10 @@ struct cpufreq_interactive_tunables {
* frequency.
*/
unsigned int max_freq_hysteresis;
+
+ /* Whether to change frequency immediately for notification */
+ bool fast_ramp_up;
+ bool fast_ramp_down;
};
/*
@@ -509,7 +513,7 @@ static void __cpufreq_interactive_timer(unsigned long data, bool is_notif)
if (cpu_load >= tunables->go_hispeed_load || tunables->boosted) {
if (ppol->policy->cur < tunables->hispeed_freq &&
- cpu_load <= MAX_LOCAL_LOAD) {
+ (!tunables->fast_ramp_up || cpu_load <= MAX_LOCAL_LOAD)) {
new_freq = tunables->hispeed_freq;
} else {
new_freq = choose_freq(ppol, loadadjfreq);
@@ -524,7 +528,7 @@ static void __cpufreq_interactive_timer(unsigned long data, bool is_notif)
new_freq = tunables->hispeed_freq;
}
- if (cpu_load <= MAX_LOCAL_LOAD &&
+ if ((!tunables->fast_ramp_up || cpu_load <= MAX_LOCAL_LOAD) &&
ppol->policy->cur >= tunables->hispeed_freq &&
new_freq > ppol->policy->cur &&
now - ppol->hispeed_validate_time <
@@ -547,7 +551,8 @@ static void __cpufreq_interactive_timer(unsigned long data, bool is_notif)
new_freq = ppol->freq_table[index].frequency;
- if (!is_notif && new_freq < ppol->target_freq &&
+ if ((!tunables->fast_ramp_down || !is_notif) &&
+ new_freq < ppol->target_freq &&
now - ppol->max_freq_hyst_start_time <
tunables->max_freq_hysteresis) {
trace_cpufreq_interactive_notyet(max_cpu, cpu_load,
@@ -560,7 +565,8 @@ static void __cpufreq_interactive_timer(unsigned long data, bool is_notif)
* Do not scale below floor_freq unless we have been at or above the
* floor frequency for the minimum sample time since last validated.
*/
- if (!is_notif && new_freq < ppol->floor_freq) {
+ if ((!tunables->fast_ramp_down || !is_notif) &&
+ new_freq < ppol->floor_freq) {
if (now - ppol->floor_validate_time <
tunables->min_sample_time) {
trace_cpufreq_interactive_notyet(
@@ -952,6 +958,8 @@ static ssize_t store_##file_name( \
}
show_store_one(max_freq_hysteresis);
show_store_one(align_windows);
+show_store_one(fast_ramp_up);
+show_store_one(fast_ramp_down);
static ssize_t show_go_hispeed_load(struct cpufreq_interactive_tunables
*tunables, char *buf)
@@ -1344,6 +1352,8 @@ show_store_gov_pol_sys(use_sched_load);
show_store_gov_pol_sys(use_migration_notif);
show_store_gov_pol_sys(max_freq_hysteresis);
show_store_gov_pol_sys(align_windows);
+show_store_gov_pol_sys(fast_ramp_up);
+show_store_gov_pol_sys(fast_ramp_down);
#define gov_sys_attr_rw(_name) \
static struct global_attr _name##_gov_sys = \
@@ -1371,6 +1381,8 @@ gov_sys_pol_attr_rw(use_sched_load);
gov_sys_pol_attr_rw(use_migration_notif);
gov_sys_pol_attr_rw(max_freq_hysteresis);
gov_sys_pol_attr_rw(align_windows);
+gov_sys_pol_attr_rw(fast_ramp_up);
+gov_sys_pol_attr_rw(fast_ramp_down);
static struct global_attr boostpulse_gov_sys =
__ATTR(boostpulse, 0200, NULL, store_boostpulse_gov_sys);
@@ -1395,6 +1407,8 @@ static struct attribute *interactive_attributes_gov_sys[] = {
&use_migration_notif_gov_sys.attr,
&max_freq_hysteresis_gov_sys.attr,
&align_windows_gov_sys.attr,
+ &fast_ramp_up_gov_sys.attr,
+ &fast_ramp_down_gov_sys.attr,
NULL,
};
@@ -1420,6 +1434,8 @@ static struct attribute *interactive_attributes_gov_pol[] = {
&use_migration_notif_gov_pol.attr,
&max_freq_hysteresis_gov_pol.attr,
&align_windows_gov_pol.attr,
+ &fast_ramp_up_gov_pol.attr,
+ &fast_ramp_down_gov_pol.attr,
NULL,
};