diff mbox series

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

Message ID 20181016101513.26919-11-quentin.perret@arm.com (mailing list archive)
State Superseded, archived
Headers show
Series Energy Aware Scheduling | expand

Commit Message

Quentin Perret Oct. 16, 2018, 10:15 a.m. UTC
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>
---
 include/linux/sched/sysctl.h |  7 +++++++
 kernel/sched/topology.c      | 29 +++++++++++++++++++++++++++++
 kernel/sysctl.c              | 11 +++++++++++
 3 files changed, 47 insertions(+)

Comments

Juri Lelli Oct. 16, 2018, 12:50 p.m. UTC | #1
Hi,

On 16/10/18 11:15, Quentin Perret wrote:

[...]

> 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

Doesn't this need to be documented in Documentation/sysctl/kernel.txt?

Also, do we want a kernel parameter as well to be able to disable this
at boot?

Best,

- Juri
Quentin Perret Oct. 16, 2018, 1:36 p.m. UTC | #2
Hi,

On Tuesday 16 Oct 2018 at 14:50:58 (+0200), Juri Lelli wrote:
> Hi,
> 
> On 16/10/18 11:15, Quentin Perret wrote:
> 
> [...]
> 
> > 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
> 
> Doesn't this need to be documented in Documentation/sysctl/kernel.txt?

Right, that'd be a good practice indeed. What do you think about the
patch below ?

> Also, do we want a kernel parameter as well to be able to disable this
> at boot?

Yeah, why not. But I guess we could always add that later if need be ?

Thanks,
Quentin

---
From: Quentin Perret <quentin.perret@arm.com>
Date: Tue, 16 Oct 2018 14:26:06 +0100
Subject: [PATCH] sched: Document sched_energy_aware sysctl

Add a new entry to Documentation/sysctl/kernel.txt explaining how
the new 'sched_energy_aware' knob should be used.

Signed-off-by: Quentin Perret <quentin.perret@arm.com>
---
 Documentation/sysctl/kernel.txt | 12 ++++++++++++
 1 file changed, 12 insertions(+)

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
Juri Lelli Oct. 16, 2018, 1:46 p.m. UTC | #3
On 16/10/18 14:36, Quentin Perret wrote:
> Hi,
> 
> On Tuesday 16 Oct 2018 at 14:50:58 (+0200), Juri Lelli wrote:
> > Hi,
> > 
> > On 16/10/18 11:15, Quentin Perret wrote:
> > 
> > [...]
> > 
> > > 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
> > 
> > Doesn't this need to be documented in Documentation/sysctl/kernel.txt?
> 
> Right, that'd be a good practice indeed. What do you think about the
> patch below ?

LGTM.

> > Also, do we want a kernel parameter as well to be able to disable this
> > at boot?
> 
> Yeah, why not. But I guess we could always add that later if need be ?

Sure. Works with me.

Thanks,

- Juri
diff mbox series

Patch

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 58bfda46ac07..e31f732d6ee7 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;
@@ -338,6 +364,9 @@  static void 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",