diff mbox

[04/16] sched/fair: Optimize find_idlest_cpu() when there is no choice

Message ID 1464001138-25063-5-git-send-email-morten.rasmussen@arm.com
State Superseded
Headers show

Commit Message

Morten Rasmussen May 23, 2016, 10:58 a.m. UTC
In the current find_idlest_group()/find_idlest_cpu() search we end up
calling find_idlest_cpu() in a sched_group containing only one cpu in
the end. Checking idle-states becomes pointless when there is no
alternative, so bail out instead.

cc: Ingo Molnar <mingo@redhat.com>
cc: Peter Zijlstra <peterz@infradead.org>

Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>

---
 kernel/sched/fair.c | 5 +++++
 1 file changed, 5 insertions(+)

-- 
1.9.1

Comments

Morten Rasmussen May 24, 2016, 8:05 a.m. UTC | #1
On Tue, May 24, 2016 at 08:29:05AM +0200, Mike Galbraith wrote:
> On Mon, 2016-05-23 at 11:58 +0100, Morten Rasmussen wrote:

> > In the current find_idlest_group()/find_idlest_cpu() search we end up

> > calling find_idlest_cpu() in a sched_group containing only one cpu in

> > the end. Checking idle-states becomes pointless when there is no

> > alternative, so bail out instead.

> > 

> > cc: Ingo Molnar <mingo@redhat.com>

> > cc: Peter Zijlstra <peterz@infradead.org>

> > 

> > Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>

> > ---

> >  kernel/sched/fair.c | 5 +++++

> >  1 file changed, 5 insertions(+)

> > 

> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c

> > index 0fe3020..564215d 100644

> > --- a/kernel/sched/fair.c

> > +++ b/kernel/sched/fair.c

> > @@ -5155,6 +5155,11 @@ find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu)

> >  > 	> int shallowest_idle_cpu = -1;

> >  > 	> int i;

> >  

> > +> 	> /* Check if we have any choice */

> > +> 	> if (group->group_weight == 1) {

> > +> 	> 	> return cpumask_first(sched_group_cpus(group));

> > +> 	> }

> > +

> 

> Hm, if task isn't allowed there, too bad?


Is that possible for single-cpu groups? I thought we skipped groups with
no cpus allowed in find_idlest_group():

                /* Skip over this group if it has no CPUs allowed */
                if (!cpumask_intersects(sched_group_cpus(group),
                                        tsk_cpus_allowed(p)))
                        continue;

Since the group has at least one cpu allowed and only contains one cpu,
that cpu must be allowed. No?
Morten Rasmussen June 7, 2016, 2:25 p.m. UTC | #2
On Wed, Jun 01, 2016 at 09:59:20PM +0200, Peter Zijlstra wrote:
> On Mon, May 23, 2016 at 11:58:46AM +0100, Morten Rasmussen wrote:

> > In the current find_idlest_group()/find_idlest_cpu() search we end up

> > calling find_idlest_cpu() in a sched_group containing only one cpu in

> > the end. Checking idle-states becomes pointless when there is no

> > alternative, so bail out instead.

> > 

> > cc: Ingo Molnar <mingo@redhat.com>

> > cc: Peter Zijlstra <peterz@infradead.org>

> > 

> > Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>

> > ---

> >  kernel/sched/fair.c | 5 +++++

> >  1 file changed, 5 insertions(+)

> > 

> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c

> > index 0fe3020..564215d 100644

> > --- a/kernel/sched/fair.c

> > +++ b/kernel/sched/fair.c

> > @@ -5155,6 +5155,11 @@ find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu)

> >  	int shallowest_idle_cpu = -1;

> >  	int i;

> >  

> > +	/* Check if we have any choice */

> > +	if (group->group_weight == 1) {

> > +		return cpumask_first(sched_group_cpus(group));

> > +	}

> 

> superfluous brackets, also isn't @this_cpu supposed to be part of the

> sched_group_cpu(group) mask?


I'll kill the brackets.

IIUC, @this_cpu is never part of sched_group_cpus(group).
find_idlest_group() never returns the local group, so if we manage to
get to find_idlest_cpu(), the group would not contain @this_cpu.
diff mbox

Patch

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 0fe3020..564215d 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5155,6 +5155,11 @@  find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu)
 	int shallowest_idle_cpu = -1;
 	int i;
 
+	/* Check if we have any choice */
+	if (group->group_weight == 1) {
+		return cpumask_first(sched_group_cpus(group));
+	}
+
 	/* Traverse only the allowed CPUs */
 	for_each_cpu_and(i, sched_group_cpus(group), tsk_cpus_allowed(p)) {
 		if (idle_cpu(i)) {