Patchwork [v10,10/15] sched: Introduce a sysctl for Energy Aware Scheduling

login
register
mail settings
Submitter Quentin Perret
Date Dec. 3, 2018, 9:56 a.m.
Message ID <20181203095628.11858-11-quentin.perret@arm.com>
Download mbox | patch
Permalink /patch/670351/
State New
Headers show

Comments

Quentin Perret - Dec. 3, 2018, 9:56 a.m.
In its current state, Energy Aware Scheduling (EAS) starts automatically
on asymmetric platforms having an Energy Model (EM). However, there are
users who want to have an EM (for thermal management for example), but
don't want EAS with it.

In order to let users disable EAS explicitly, introduce a new sysctl
called 'sched_energy_aware'. It is enabled by default so that EAS can
start automatically on platforms where it makes sense. Flipping it to 0
rebuilds the scheduling domains and disables EAS.

Signed-off-by: Quentin Perret <quentin.perret@arm.com>
---
 Documentation/sysctl/kernel.txt | 12 ++++++++++++
 include/linux/sched/sysctl.h    |  7 +++++++
 kernel/sched/topology.c         | 29 +++++++++++++++++++++++++++++
 kernel/sysctl.c                 | 11 +++++++++++
 4 files changed, 59 insertions(+)
Ingo Molnar - Dec. 11, 2018, 2:15 p.m.
* Quentin Perret <quentin.perret@arm.com> wrote:

> In its current state, Energy Aware Scheduling (EAS) starts automatically
> on asymmetric platforms having an Energy Model (EM). However, there are
> users who want to have an EM (for thermal management for example), but
> don't want EAS with it.

Well, then introduce a new Kconfig variant for EAS, if it's super 
important to allow this to be disabled.

Why do we want to disable it - is it not reliable in some circumstances?

> In order to let users disable EAS explicitly, introduce a new sysctl
> called 'sched_energy_aware'. It is enabled by default so that EAS can
> start automatically on platforms where it makes sense. Flipping it to 0
> rebuilds the scheduling domains and disables EAS.

Yeah, making this a sysctl ABI is asking for trouble - this really should 
be a Kconfig or debug space knob, at most.

Thanks,

	Ingo
Quentin Perret - Dec. 11, 2018, 2:49 p.m.
Hi Ingo,

On Tuesday 11 Dec 2018 at 15:15:09 (+0100), Ingo Molnar wrote:
> 
> * Quentin Perret <quentin.perret@arm.com> wrote:
> 
> > In its current state, Energy Aware Scheduling (EAS) starts automatically
> > on asymmetric platforms having an Energy Model (EM). However, there are
> > users who want to have an EM (for thermal management for example), but
> > don't want EAS with it.
> 
> Well, then introduce a new Kconfig variant for EAS, if it's super 
> important to allow this to be disabled.
> 
> Why do we want to disable it - is it not reliable in some circumstances?

There are people out there using big.little systems who do not care
about energy. Not very many of them, that is true, but they exist. And
those people can be interested in having an Energy Model for
IPA/thermal but also want to spread tasks to minimize latency for
example. So those guys will appreciate a knob, I think. Otherwise EAS
gets enabled/disabled only by side effects (by enabling/disabling
schedutil for example).

> > In order to let users disable EAS explicitly, introduce a new sysctl
> > called 'sched_energy_aware'. It is enabled by default so that EAS can
> > start automatically on platforms where it makes sense. Flipping it to 0
> > rebuilds the scheduling domains and disables EAS.
> 
> Yeah, making this a sysctl ABI is asking for trouble - this really should 
> be a Kconfig or debug space knob, at most.

My original proposal was a sched_feat, but Peter didn't like it because,
well, it's a debug knob :-). I'm personally not against a Kconfig, I
just had the feeling scheduler-specific Kconfig weren't welcome in
general. But if you feel like EAS could be a reasonable exception to the
rule, I won't argue. Otherwise, Juri suggested to have a command line
option at some point. Would that be a better solution ?

Also, when you say we're asking for trouble, what are you referring to
exactly ? There are a couple of existing sysctl to enable/disable
scheduler features.

Thanks,
Quentin
Peter Zijlstra - Dec. 13, 2018, 2:03 p.m.
On Tue, Dec 11, 2018 at 02:49:01PM +0000, Quentin Perret wrote:
> Hi Ingo,
> 
> On Tuesday 11 Dec 2018 at 15:15:09 (+0100), Ingo Molnar wrote:
> > 
> > * Quentin Perret <quentin.perret@arm.com> wrote:
> > 
> > > In its current state, Energy Aware Scheduling (EAS) starts automatically
> > > on asymmetric platforms having an Energy Model (EM). However, there are
> > > users who want to have an EM (for thermal management for example), but
> > > don't want EAS with it.
> > 
> > Well, then introduce a new Kconfig variant for EAS, if it's super 
> > important to allow this to be disabled.
> > 
> > Why do we want to disable it - is it not reliable in some circumstances?
> 
> There are people out there using big.little systems who do not care
> about energy. Not very many of them, that is true, but they exist. And
> those people can be interested in having an Energy Model for
> IPA/thermal but also want to spread tasks to minimize latency for
> example. So those guys will appreciate a knob, I think. Otherwise EAS
> gets enabled/disabled only by side effects (by enabling/disabling
> schedutil for example).

Right, also we have a sysctl for numa-balancing, I figured having one
for eas would not be weird.

Patch

diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 37a679501ddc..36bee799ee9e 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -78,6 +78,7 @@  show up in /proc/sys/kernel:
 - reboot-cmd                  [ SPARC only ]
 - rtsig-max
 - rtsig-nr
+- sched_energy_aware
 - seccomp/                    ==> Documentation/userspace-api/seccomp_filter.rst
 - sem
 - sem_next_id		      [ sysv ipc ]
@@ -872,6 +873,17 @@  rtsig-nr shows the number of RT signals currently queued.
 
 ==============================================================
 
+sched_energy_aware:
+
+Enables/disables Energy Aware Scheduling (EAS). EAS starts
+automatically on platforms where it can run (that is,
+platforms with asymmetric CPU topologies and having an Energy
+Model available). If your platform happens to meet the
+requirements for EAS but you do not want to use it, change
+this value to 0.
+
+==============================================================
+
 sched_schedstats:
 
 Enables/disables scheduler statistics. Enabling this feature
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index a9c32daeb9d8..99ce6d728df7 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -83,4 +83,11 @@  extern int sysctl_schedstats(struct ctl_table *table, int write,
 				 void __user *buffer, size_t *lenp,
 				 loff_t *ppos);
 
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+extern unsigned int sysctl_sched_energy_aware;
+extern int sched_energy_aware_handler(struct ctl_table *table, int write,
+				 void __user *buffer, size_t *lenp,
+				 loff_t *ppos);
+#endif
+
 #endif /* _LINUX_SCHED_SYSCTL_H */
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 24d211ca384d..1639d4a0e8b4 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -203,9 +203,35 @@  sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
 
 DEFINE_STATIC_KEY_FALSE(sched_energy_present);
 #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+unsigned int sysctl_sched_energy_aware = 1;
 DEFINE_MUTEX(sched_energy_mutex);
 bool sched_energy_update;
 
+#ifdef CONFIG_PROC_SYSCTL
+int sched_energy_aware_handler(struct ctl_table *table, int write,
+			 void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+	int ret, state;
+
+	if (write && !capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
+	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
+	if (!ret && write) {
+		state = static_branch_unlikely(&sched_energy_present);
+		if (state != sysctl_sched_energy_aware) {
+			mutex_lock(&sched_energy_mutex);
+			sched_energy_update = 1;
+			rebuild_sched_domains();
+			sched_energy_update = 0;
+			mutex_unlock(&sched_energy_mutex);
+		}
+	}
+
+	return ret;
+}
+#endif
+
 static void free_pd(struct perf_domain *pd)
 {
 	struct perf_domain *tmp;
@@ -322,6 +348,9 @@  static bool build_perf_domains(const struct cpumask *cpu_map)
 	struct cpufreq_policy *policy;
 	struct cpufreq_governor *gov;
 
+	if (!sysctl_sched_energy_aware)
+		goto free;
+
 	/* EAS is enabled for asymmetric CPU capacity topologies. */
 	if (!per_cpu(sd_asym_cpucapacity, cpu)) {
 		if (sched_debug()) {
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index cc02050fd0c4..481309a11174 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -466,6 +466,17 @@  static struct ctl_table kern_table[] = {
 		.extra1		= &one,
 	},
 #endif
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
+	{
+		.procname	= "sched_energy_aware",
+		.data		= &sysctl_sched_energy_aware,
+		.maxlen		= sizeof(unsigned int),
+		.mode		= 0644,
+		.proc_handler	= sched_energy_aware_handler,
+		.extra1		= &zero,
+		.extra2		= &one,
+	},
+#endif
 #ifdef CONFIG_PROVE_LOCKING
 	{
 		.procname	= "prove_locking",