Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 594945e6 authored by Junjie Wu's avatar Junjie Wu Committed by Matt Wagantall
Browse files

cpufreq: interactive: Skip delay in frequency changes due to migration



The above hispeed delay and min sample time delays are used to
distinguish between sporadic load changes versus steady state load
changes. The governor tried to make sure the frequency changes only
when the load change is a steady state load change.

However, when the load change is for predictable reasons like
migration, the delays only negatively affect performance and power.
Once a significant load is migrated into a CPU, it's fairly reasonable
to assume it's going to continue contributing that additional load.
Similarly once a significant load is migrated away from a CPU, it's
fairly reasonable to assume the load will be gone forever. Future
migrations can bring back a load or take it away, but the
notifications that come along with it will allow us to quickly correct
for it. For this reason, when the load change is due to a
notification, do not delay frequency changes.

Change-Id: I19ad294b599e30654fbbeb0c56e8b50b0e19198f
Signed-off-by: default avatarJunjie Wu <junjiew@codeaurora.org>
parent 20b2a754
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -391,7 +391,7 @@ static u64 update_load(int cpu)
}

#define MAX_LOCAL_LOAD 100
static void cpufreq_interactive_timer(unsigned long data)
static void __cpufreq_interactive_timer(unsigned long data, bool is_notif)
{
	u64 now;
	unsigned int delta_time;
@@ -497,7 +497,7 @@ static void cpufreq_interactive_timer(unsigned long data)

	new_freq = pcpu->freq_table[index].frequency;

	if (new_freq < pcpu->target_freq &&
	if (!is_notif && new_freq < pcpu->target_freq &&
	    now - pcpu->max_freq_hyst_start_time <
	    tunables->max_freq_hysteresis) {
		trace_cpufreq_interactive_notyet(data, cpu_load,
@@ -511,7 +511,7 @@ static void cpufreq_interactive_timer(unsigned long data)
	 * floor frequency for the minimum sample time since last validated.
	 */
	max_fvtime = max(pcpu->floor_validate_time, pcpu->local_fvtime);
	if (new_freq < pcpu->floor_freq &&
	if (!is_notif && new_freq < pcpu->floor_freq &&
	    pcpu->target_freq >= pcpu->policy->cur) {
		if (now - max_fvtime < tunables->min_sample_time) {
			trace_cpufreq_interactive_notyet(
@@ -568,6 +568,10 @@ exit:
	return;
}

static void cpufreq_interactive_timer(unsigned long data)
{
	__cpufreq_interactive_timer(data, false);
}

static void cpufreq_interactive_idle_end(void)
{
@@ -739,7 +743,7 @@ static int load_change_callback(struct notifier_block *nb, unsigned long val,
	trace_cpufreq_interactive_load_change(cpu);
	del_timer(&pcpu->cpu_timer);
	del_timer(&pcpu->cpu_slack_timer);
	cpufreq_interactive_timer(cpu);
	__cpufreq_interactive_timer(cpu, true);

	up_read(&pcpu->enable_sem);
	return 0;