mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
cpufreq: interactive: only boost tunable affected cpus
It is not correct to boost all the cpus when tunable boost parameters are changed. It also does not need to boost the cpus which is already boosted. Signed-off-by: Lianwei Wang <a22439@motorola.com>
This commit is contained in:
committed by
Ruchi Kandoi
parent
0065bf4206
commit
805863ee7e
@@ -107,6 +107,7 @@ struct cpufreq_interactive_tunables {
|
||||
int boostpulse_duration_val;
|
||||
/* End time of boost pulse in ktime converted to usecs */
|
||||
u64 boostpulse_endtime;
|
||||
bool boosted;
|
||||
/*
|
||||
* Max additional time to wait in idle, beyond timer_rate, at speeds
|
||||
* above minimum before wakeup to reduce speed, or -1 if unnecessary.
|
||||
@@ -384,7 +385,6 @@ static void cpufreq_interactive_timer(unsigned long data)
|
||||
unsigned int loadadjfreq;
|
||||
unsigned int index;
|
||||
unsigned long flags;
|
||||
bool boosted;
|
||||
|
||||
if (!down_read_trylock(&pcpu->enable_sem))
|
||||
return;
|
||||
@@ -404,9 +404,9 @@ static void cpufreq_interactive_timer(unsigned long data)
|
||||
do_div(cputime_speedadj, delta_time);
|
||||
loadadjfreq = (unsigned int)cputime_speedadj * 100;
|
||||
cpu_load = loadadjfreq / pcpu->target_freq;
|
||||
boosted = tunables->boost_val || now < tunables->boostpulse_endtime;
|
||||
tunables->boosted = tunables->boost_val || now < tunables->boostpulse_endtime;
|
||||
|
||||
if (cpu_load >= tunables->go_hispeed_load || boosted) {
|
||||
if (cpu_load >= tunables->go_hispeed_load || tunables->boosted) {
|
||||
if (pcpu->target_freq < tunables->hispeed_freq) {
|
||||
new_freq = tunables->hispeed_freq;
|
||||
} else {
|
||||
@@ -467,7 +467,7 @@ static void cpufreq_interactive_timer(unsigned long data)
|
||||
* (or the indefinite boost is turned off).
|
||||
*/
|
||||
|
||||
if (!boosted || new_freq > tunables->hispeed_freq) {
|
||||
if (!tunables->boosted || new_freq > tunables->hispeed_freq) {
|
||||
pcpu->floor_freq = new_freq;
|
||||
pcpu->floor_validate_time = now;
|
||||
}
|
||||
@@ -625,19 +625,21 @@ static int cpufreq_interactive_speedchange_task(void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cpufreq_interactive_boost(void)
|
||||
static void cpufreq_interactive_boost(struct cpufreq_interactive_tunables *tunables)
|
||||
{
|
||||
int i;
|
||||
int anyboost = 0;
|
||||
unsigned long flags[2];
|
||||
struct cpufreq_interactive_cpuinfo *pcpu;
|
||||
struct cpufreq_interactive_tunables *tunables;
|
||||
|
||||
tunables->boosted = true;
|
||||
|
||||
spin_lock_irqsave(&speedchange_cpumask_lock, flags[0]);
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
pcpu = &per_cpu(cpuinfo, i);
|
||||
tunables = pcpu->policy->governor_data;
|
||||
if (tunables != pcpu->policy->governor_data)
|
||||
continue;
|
||||
|
||||
spin_lock_irqsave(&pcpu->target_freq_lock, flags[1]);
|
||||
if (pcpu->target_freq < tunables->hispeed_freq) {
|
||||
@@ -950,7 +952,8 @@ static ssize_t store_boost(struct cpufreq_interactive_tunables *tunables,
|
||||
|
||||
if (tunables->boost_val) {
|
||||
trace_cpufreq_interactive_boost("on");
|
||||
cpufreq_interactive_boost();
|
||||
if (!tunables->boosted)
|
||||
cpufreq_interactive_boost(tunables);
|
||||
} else {
|
||||
tunables->boostpulse_endtime = ktime_to_us(ktime_get());
|
||||
trace_cpufreq_interactive_unboost("off");
|
||||
@@ -972,7 +975,8 @@ static ssize_t store_boostpulse(struct cpufreq_interactive_tunables *tunables,
|
||||
tunables->boostpulse_endtime = ktime_to_us(ktime_get()) +
|
||||
tunables->boostpulse_duration_val;
|
||||
trace_cpufreq_interactive_boost("pulse");
|
||||
cpufreq_interactive_boost();
|
||||
if (!tunables->boosted)
|
||||
cpufreq_interactive_boost(tunables);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user