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

Commit 78814285 authored by Quentin Perret's avatar Quentin Perret
Browse files

FROMLIST: sched: Introduce sched_energy_present static key



In order to make sure Energy Aware Scheduling (EAS) will not impact
systems where no Energy Model is available, introduce a static key
guarding the access to EAS code. Since EAS is enabled on a
per-root-domain basis, the static key is enabled when at least one root
domain meets all conditions for EAS.

Change-Id: Ifa3e490e023d3f57b2f1b1272d5ea58d6ae726ab
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarQuentin Perret <quentin.perret@arm.com>
Message-Id: <20181016101513.26919-10-quentin.perret@arm.com>
Signed-off-by: default avatarQuentin Perret <quentin.perret@arm.com>
parent 1e6b1214
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2281,3 +2281,7 @@ unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned
#else
#define perf_domain_span(pd) NULL
#endif

#ifdef CONFIG_SMP
extern struct static_key_false sched_energy_present;
#endif
+31 −0
Original line number Diff line number Diff line
@@ -201,6 +201,7 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
	return 1;
}

DEFINE_STATIC_KEY_FALSE(sched_energy_present);
#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
DEFINE_MUTEX(sched_energy_mutex);
bool sched_energy_update;
@@ -273,6 +274,35 @@ static void destroy_perf_domain_rcu(struct rcu_head *rp)
	free_pd(pd);
}

static void sched_energy_start(int ndoms_new, cpumask_var_t doms_new[])
{
	/*
	 * The conditions for EAS to start are checked during the creation of
	 * root domains. If one of them meets all conditions, it will have a
	 * non-null list of performance domains.
	 */
	while (ndoms_new) {
		if (cpu_rq(cpumask_first(doms_new[ndoms_new - 1]))->rd->pd)
			goto enable;
		ndoms_new--;
	}

	if (static_branch_unlikely(&sched_energy_present)) {
		if (sched_debug())
			pr_info("%s: stopping EAS\n", __func__);
		static_branch_disable_cpuslocked(&sched_energy_present);
	}

	return;

enable:
	if (!static_branch_unlikely(&sched_energy_present)) {
		if (sched_debug())
			pr_info("%s: starting EAS\n", __func__);
		static_branch_enable_cpuslocked(&sched_energy_present);
	}
}

/*
 * EAS can be used on a root domain if it meets all the following conditions:
 *    1. an Energy Model (EM) is available;
@@ -2187,6 +2217,7 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
match3:
		;
	}
	sched_energy_start(ndoms_new, doms_new);
#endif

	/* Remember the new sched domains: */