2014-01-15 14:24:15

by Alex Shi

[permalink] [raw]
Subject: [RFC PATCH] sched: select_idle_sibling macro optimize

If the sd domain just has one group, then we must be caught the
i == target later, and then goes to deeper level domain.
So just skip this domain checking to save some instructions.

Signed-off-by: Alex Shi <[email protected]>
---
kernel/sched/fair.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index c7395d9..3265fbc 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4196,6 +4196,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
sd = rcu_dereference(per_cpu(sd_llc, target));
for_each_lower_domain(sd) {
sg = sd->groups;
+
+ /* skip single group domain */
+ if (sg == sg->next)
+ continue;
+
do {
if (!cpumask_intersects(sched_group_cpus(sg),
tsk_cpus_allowed(p)))
--
1.8.1.2


2014-01-16 13:13:36

by Alex Shi

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

Add Mike Galbraith.

Any one like to give some comments?

On 01/15/2014 10:23 PM, Alex Shi wrote:
> If the sd domain just has one group, then we must be caught the
> i == target later, and then goes to deeper level domain.
> So just skip this domain checking to save some instructions.
>
> Signed-off-by: Alex Shi <[email protected]>
> ---
> kernel/sched/fair.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index c7395d9..3265fbc 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -4196,6 +4196,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
> sd = rcu_dereference(per_cpu(sd_llc, target));
> for_each_lower_domain(sd) {
> sg = sd->groups;
> +
> + /* skip single group domain */
> + if (sg == sg->next)
> + continue;
> +
> do {
> if (!cpumask_intersects(sched_group_cpus(sg),
> tsk_cpus_allowed(p)))
>


--
Thanks
Alex

2014-01-16 13:52:21

by Mike Galbraith

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

On Thu, 2014-01-16 at 21:13 +0800, Alex Shi wrote:
> Add Mike Galbraith.
>
> Any one like to give some comments?
>
> On 01/15/2014 10:23 PM, Alex Shi wrote:
> > If the sd domain just has one group, then we must be caught the
> > i == target later, and then goes to deeper level domain.
> > So just skip this domain checking to save some instructions.
> >
> > Signed-off-by: Alex Shi <[email protected]>
> > ---
> > kernel/sched/fair.c | 5 +++++
> > 1 file changed, 5 insertions(+)
> >
> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> > index c7395d9..3265fbc 100644
> > --- a/kernel/sched/fair.c
> > +++ b/kernel/sched/fair.c
> > @@ -4196,6 +4196,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
> > sd = rcu_dereference(per_cpu(sd_llc, target));
> > for_each_lower_domain(sd) {
> > sg = sd->groups;
> > +
> > + /* skip single group domain */
> > + if (sg == sg->next)
> > + continue;

When is that gonna happen?

-Mike

2014-01-17 02:14:40

by Alex Shi

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

On 01/16/2014 09:52 PM, Mike Galbraith wrote:
> On Thu, 2014-01-16 at 21:13 +0800, Alex Shi wrote:
>> Add Mike Galbraith.
>>
>> Any one like to give some comments?
>>
>> On 01/15/2014 10:23 PM, Alex Shi wrote:
>>> If the sd domain just has one group, then we must be caught the
>>> i == target later, and then goes to deeper level domain.
>>> So just skip this domain checking to save some instructions.
>>>
>>> Signed-off-by: Alex Shi <[email protected]>
>>> ---
>>> kernel/sched/fair.c | 5 +++++
>>> 1 file changed, 5 insertions(+)
>>>
>>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>>> index c7395d9..3265fbc 100644
>>> --- a/kernel/sched/fair.c
>>> +++ b/kernel/sched/fair.c
>>> @@ -4196,6 +4196,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
>>> sd = rcu_dereference(per_cpu(sd_llc, target));
>>> for_each_lower_domain(sd) {
>>> sg = sd->groups;
>>> +
>>> + /* skip single group domain */
>>> + if (sg == sg->next)
>>> + continue;
>
> When is that gonna happen?

I had seen this in a Intel platform, you may have both CPU domain and MC
domain layer, because the domain flag is different, then they can not be
merged. and then the CPU domain just has one group.
>
> -Mike
>
>


--
Thanks
Alex

2014-01-17 03:15:47

by Michael wang

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

On 01/17/2014 10:14 AM, Alex Shi wrote:
[snip]
>>
>> When is that gonna happen?
>
> I had seen this in a Intel platform, you may have both CPU domain and MC
> domain layer, because the domain flag is different, then they can not be
> merged. and then the CPU domain just has one group.

CPU and MC are different domains, isn't it?

General should like:

CPU cpu0 cpu1
MC core0 core1 core0 core1
SMT cpu 0 cpu 1 cpu 2 cpu 3 cpu 4 cpu 5 cpu 6 cpu 7

So for cpu0:

CPU sg0:cpu0,1,2,3 sg1:cpu4,5,6,7
MC sg0:cpu0,1 sg1:cpu2,3
SMT sg0:cpu0 sg1:cpu1

If one domain only have one group, that's sounds really a weird topology...

Regards,
Michael Wang

>>
>> -Mike
>>
>>
>
>

2014-01-17 03:36:23

by Mike Galbraith

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

On Fri, 2014-01-17 at 10:14 +0800, Alex Shi wrote:
> On 01/16/2014 09:52 PM, Mike Galbraith wrote:
> > On Thu, 2014-01-16 at 21:13 +0800, Alex Shi wrote:
> >> Add Mike Galbraith.
> >>
> >> Any one like to give some comments?
> >>
> >> On 01/15/2014 10:23 PM, Alex Shi wrote:
> >>> If the sd domain just has one group, then we must be caught the
> >>> i == target later, and then goes to deeper level domain.
> >>> So just skip this domain checking to save some instructions.
> >>>
> >>> Signed-off-by: Alex Shi <[email protected]>
> >>> ---
> >>> kernel/sched/fair.c | 5 +++++
> >>> 1 file changed, 5 insertions(+)
> >>>
> >>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> >>> index c7395d9..3265fbc 100644
> >>> --- a/kernel/sched/fair.c
> >>> +++ b/kernel/sched/fair.c
> >>> @@ -4196,6 +4196,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
> >>> sd = rcu_dereference(per_cpu(sd_llc, target));
> >>> for_each_lower_domain(sd) {
> >>> sg = sd->groups;
> >>> +
> >>> + /* skip single group domain */
> >>> + if (sg == sg->next)
> >>> + continue;
> >
> > When is that gonna happen?
>
> I had seen this in a Intel platform, you may have both CPU domain and MC
> domain layer, because the domain flag is different, then they can not be
> merged. and then the CPU domain just has one group.

But sd starts at MC.

-Mike

2014-01-17 05:44:09

by Alex Shi

[permalink] [raw]
Subject: Re: [RFC PATCH] sched: select_idle_sibling macro optimize

On 01/17/2014 11:36 AM, Mike Galbraith wrote:
>>>>> +
>>>>> > >>> + /* skip single group domain */
>>>>> > >>> + if (sg == sg->next)
>>>>> > >>> + continue;
>>> > >
>>> > > When is that gonna happen?
>> >
>> > I had seen this in a Intel platform, you may have both CPU domain and MC
>> > domain layer, because the domain flag is different, then they can not be
>> > merged. and then the CPU domain just has one group.
> But sd starts at MC.

That's true. Sorry for noise.

--
Thanks
Alex