Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-23 Thread Alex Shi
On Fri, Dec 21, 2012 at 12:28 PM, Namhyung Kim  wrote:
> Hi,
>
> On Tue, 11 Dec 2012 12:00:55 +0530, Preeti U. Murthy wrote:
>> On 12/11/2012 10:58 AM, Alex Shi wrote:
>>> On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
> It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?
>>>
>>> your worry make sense, but the code handle the situation, in
>>> select_task_rq(), it will check the cpu allowed again. if the answer is
>>> no, it will fallback to old cpu.

> And since find_idlest_group only return a different group which
> excludes old cpu, it's also imporissible to find a new cpu same as old
> cpu.
>>
>> I doubt this will work correctly.Consider the following situation:sched
>> domain begins with sd that encloses both socket1 and socket2
>>
>> cpu0 cpu1  | cpu2 cpu3
>> ---|-
>>  socket1   |  socket2
>>
>> old cpu = cpu1
>>
>> Iteration1:
>> 1.find_idlest_group() returns socket2 to be idlest.
>> 2.task changes tsk_allowed_cpus to 0,1
>> 3.find_idlest_cpu() returns cpu2
>
> AFAIK The tsk->cpus_allowed cannot be changed during the operation since
> it's protected by tsk->pi_lock.  I can see the following comment:

You are right. I misunderstand some comments in wake_up_new_task.


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-23 Thread Alex Shi
On Fri, Dec 21, 2012 at 12:28 PM, Namhyung Kim namhy...@kernel.org wrote:
 Hi,

 On Tue, 11 Dec 2012 12:00:55 +0530, Preeti U. Murthy wrote:
 On 12/11/2012 10:58 AM, Alex Shi wrote:
 On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?

 your worry make sense, but the code handle the situation, in
 select_task_rq(), it will check the cpu allowed again. if the answer is
 no, it will fallback to old cpu.

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.

 I doubt this will work correctly.Consider the following situation:sched
 domain begins with sd that encloses both socket1 and socket2

 cpu0 cpu1  | cpu2 cpu3
 ---|-
  socket1   |  socket2

 old cpu = cpu1

 Iteration1:
 1.find_idlest_group() returns socket2 to be idlest.
 2.task changes tsk_allowed_cpus to 0,1
 3.find_idlest_cpu() returns cpu2

 AFAIK The tsk-cpus_allowed cannot be changed during the operation since
 it's protected by tsk-pi_lock.  I can see the following comment:

You are right. I misunderstand some comments in wake_up_new_task.


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-20 Thread Namhyung Kim
Hi,

On Tue, 11 Dec 2012 12:00:55 +0530, Preeti U. Murthy wrote:
> On 12/11/2012 10:58 AM, Alex Shi wrote:
>> On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
>>> Hi Alex,
>>>
>>> On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.
>>>
>>> The one thing I am concerned with here is if there is a possibility of
>>> the task changing its tsk_cpus_allowed() while this code is running.
>>>
>>> i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
>>> for the task changes,perhaps by the user himself,which might not include
>>> the cpus in the idle group.After this find_idlest_cpu() is called.I mean
>>> a race condition in short.Then we might not have an eligible cpu in that
>>> group right?
>> 
>> your worry make sense, but the code handle the situation, in
>> select_task_rq(), it will check the cpu allowed again. if the answer is
>> no, it will fallback to old cpu.
>>>
 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.
>
> I doubt this will work correctly.Consider the following situation:sched
> domain begins with sd that encloses both socket1 and socket2
>
> cpu0 cpu1  | cpu2 cpu3
> ---|-
>  socket1   |  socket2
>
> old cpu = cpu1
>
> Iteration1:
> 1.find_idlest_group() returns socket2 to be idlest.
> 2.task changes tsk_allowed_cpus to 0,1
> 3.find_idlest_cpu() returns cpu2

AFAIK The tsk->cpus_allowed cannot be changed during the operation since
it's protected by tsk->pi_lock.  I can see the following comment:

kernel/sched/core.c:
/*
 * The caller (fork, wakeup) owns p->pi_lock, ->cpus_allowed is stable.
 */
static inline
int select_task_rq(struct task_struct *p, int sd_flags, int wake_flags)
{
int cpu = p->sched_class->select_task_rq(p, sd_flags, wake_flags);



Thanks,
Namhyung
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-20 Thread Namhyung Kim
Hi,

On Tue, 11 Dec 2012 12:00:55 +0530, Preeti U. Murthy wrote:
 On 12/11/2012 10:58 AM, Alex Shi wrote:
 On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?
 
 your worry make sense, but the code handle the situation, in
 select_task_rq(), it will check the cpu allowed again. if the answer is
 no, it will fallback to old cpu.

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.

 I doubt this will work correctly.Consider the following situation:sched
 domain begins with sd that encloses both socket1 and socket2

 cpu0 cpu1  | cpu2 cpu3
 ---|-
  socket1   |  socket2

 old cpu = cpu1

 Iteration1:
 1.find_idlest_group() returns socket2 to be idlest.
 2.task changes tsk_allowed_cpus to 0,1
 3.find_idlest_cpu() returns cpu2

AFAIK The tsk-cpus_allowed cannot be changed during the operation since
it's protected by tsk-pi_lock.  I can see the following comment:

kernel/sched/core.c:
/*
 * The caller (fork, wakeup) owns p-pi_lock, -cpus_allowed is stable.
 */
static inline
int select_task_rq(struct task_struct *p, int sd_flags, int wake_flags)
{
int cpu = p-sched_class-select_task_rq(p, sd_flags, wake_flags);



Thanks,
Namhyung
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-11 Thread Preeti U Murthy
On 12/11/2012 05:23 PM, Alex Shi wrote:
> On 12/11/2012 02:30 PM, Preeti U Murthy wrote:
>> On 12/11/2012 10:58 AM, Alex Shi wrote:
>>> On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
> It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?
>>>
>>> your worry make sense, but the code handle the situation, in
>>> select_task_rq(), it will check the cpu allowed again. if the answer is
>>> no, it will fallback to old cpu.

> And since find_idlest_group only return a different group which
> excludes old cpu, it's also imporissible to find a new cpu same as old
> cpu.
>>
>> I doubt this will work correctly.Consider the following situation:sched
>> domain begins with sd that encloses both socket1 and socket2
>>
>> cpu0 cpu1  | cpu2 cpu3
>> ---|-
>>  socket1   |  socket2
>>
>> old cpu = cpu1
>>
>> Iteration1:
>> 1.find_idlest_group() returns socket2 to be idlest.
>> 2.task changes tsk_allowed_cpus to 0,1
>> 3.find_idlest_cpu() returns cpu2
>>
>> * without your patch
>>1.the condition after find_idlest_cpu() returns -1,and sd->child is
>> chosen which happens to be socket1
>>2.in the next iteration, find_idlest_group() and find_idlest_cpu()
>> will probably choose cpu0 which happens to be idler than cpu1,which is
>> in tsk_allowed_cpu.
> 
> Thanks for question Preeti! :)
> 
> Yes, with more iteration you has more possibility to get task allowed
> cpu in select_task_rq_fair. but how many opportunity the situation
> happened?  how much gain you get here?
> With LCPU increasing many many iterations cause scalability issue. that
> is the simplified forking patchset for. and that why 10% performance
> gain on hackbench process/thread.
> 
> and if you insist want not to miss your chance in strf(), the current
> iteration is still not enough. How you know the idlest cpu is still
> idlest after this function finished? how to ensure the allowed cpu won't
> be changed again?
> 
> A quick snapshot is enough in balancing here. we still has periodic
> balacning.

Hmm ok,let me look at this more closely.
> 
>>
>> * with your patch
>>1.the condition after find_idlest_cpu() does not exist,therefore
>> a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
>> the for_each_domain() loop).
>>2.in the next iteration, find_idlest_group() return NULL,because
>> there is no cpu which intersects with tsk_allowed_cpus.
>>3.in select task rq,the fallback cpu is chosen even when an idle cpu
>> existed.
>>
>> So my concern is though select_task_rq() checks the
>> tsk_allowed_cpus(),you might end up choosing a different path of
>> sched_domains compared to without this patch as shown above.
>>
>> In short without the "if(new_cpu==-1)" condition we might get misled
>> doing unnecessary iterations over the wrong sched domains in
>> select_task_rq_fair().(Think about situations when not all the cpus of
>> socket2 are disallowed by the task,then there will more iterations in
> 
> After read the first 4 patches, believe you will find the patchset is
> trying to reduce iterations, not increase them.

Right,sorry about not noticing this.
> 
>> the wrong path of sched_domains before exit,compared to what is shown
>> above.)
>>
Regards
Preeti U Murthy

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-11 Thread Alex Shi
On 12/11/2012 02:30 PM, Preeti U Murthy wrote:
> On 12/11/2012 10:58 AM, Alex Shi wrote:
>> On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
>>> Hi Alex,
>>>
>>> On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.
>>>
>>> The one thing I am concerned with here is if there is a possibility of
>>> the task changing its tsk_cpus_allowed() while this code is running.
>>>
>>> i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
>>> for the task changes,perhaps by the user himself,which might not include
>>> the cpus in the idle group.After this find_idlest_cpu() is called.I mean
>>> a race condition in short.Then we might not have an eligible cpu in that
>>> group right?
>>
>> your worry make sense, but the code handle the situation, in
>> select_task_rq(), it will check the cpu allowed again. if the answer is
>> no, it will fallback to old cpu.
>>>
 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.
> 
> I doubt this will work correctly.Consider the following situation:sched
> domain begins with sd that encloses both socket1 and socket2
> 
> cpu0 cpu1  | cpu2 cpu3
> ---|-
>  socket1   |  socket2
> 
> old cpu = cpu1
> 
> Iteration1:
> 1.find_idlest_group() returns socket2 to be idlest.
> 2.task changes tsk_allowed_cpus to 0,1
> 3.find_idlest_cpu() returns cpu2
> 
> * without your patch
>1.the condition after find_idlest_cpu() returns -1,and sd->child is
> chosen which happens to be socket1
>2.in the next iteration, find_idlest_group() and find_idlest_cpu()
> will probably choose cpu0 which happens to be idler than cpu1,which is
> in tsk_allowed_cpu.

Thanks for question Preeti! :)

Yes, with more iteration you has more possibility to get task allowed
cpu in select_task_rq_fair. but how many opportunity the situation
happened?  how much gain you get here?
With LCPU increasing many many iterations cause scalability issue. that
is the simplified forking patchset for. and that why 10% performance
gain on hackbench process/thread.

and if you insist want not to miss your chance in strf(), the current
iteration is still not enough. How you know the idlest cpu is still
idlest after this function finished? how to ensure the allowed cpu won't
be changed again?

A quick snapshot is enough in balancing here. we still has periodic
balacning.

> 
> * with your patch
>1.the condition after find_idlest_cpu() does not exist,therefore
> a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
> the for_each_domain() loop).
>2.in the next iteration, find_idlest_group() return NULL,because
> there is no cpu which intersects with tsk_allowed_cpus.
>3.in select task rq,the fallback cpu is chosen even when an idle cpu
> existed.
> 
> So my concern is though select_task_rq() checks the
> tsk_allowed_cpus(),you might end up choosing a different path of
> sched_domains compared to without this patch as shown above.
> 
> In short without the "if(new_cpu==-1)" condition we might get misled
> doing unnecessary iterations over the wrong sched domains in
> select_task_rq_fair().(Think about situations when not all the cpus of
> socket2 are disallowed by the task,then there will more iterations in

After read the first 4 patches, believe you will find the patchset is
trying to reduce iterations, not increase them.

> the wrong path of sched_domains before exit,compared to what is shown
> above.)
> 
> Regards
> Preeti U Murthy
> 
> 


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-11 Thread Alex Shi
On 12/11/2012 02:30 PM, Preeti U Murthy wrote:
 On 12/11/2012 10:58 AM, Alex Shi wrote:
 On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?

 your worry make sense, but the code handle the situation, in
 select_task_rq(), it will check the cpu allowed again. if the answer is
 no, it will fallback to old cpu.

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.
 
 I doubt this will work correctly.Consider the following situation:sched
 domain begins with sd that encloses both socket1 and socket2
 
 cpu0 cpu1  | cpu2 cpu3
 ---|-
  socket1   |  socket2
 
 old cpu = cpu1
 
 Iteration1:
 1.find_idlest_group() returns socket2 to be idlest.
 2.task changes tsk_allowed_cpus to 0,1
 3.find_idlest_cpu() returns cpu2
 
 * without your patch
1.the condition after find_idlest_cpu() returns -1,and sd-child is
 chosen which happens to be socket1
2.in the next iteration, find_idlest_group() and find_idlest_cpu()
 will probably choose cpu0 which happens to be idler than cpu1,which is
 in tsk_allowed_cpu.

Thanks for question Preeti! :)

Yes, with more iteration you has more possibility to get task allowed
cpu in select_task_rq_fair. but how many opportunity the situation
happened?  how much gain you get here?
With LCPU increasing many many iterations cause scalability issue. that
is the simplified forking patchset for. and that why 10% performance
gain on hackbench process/thread.

and if you insist want not to miss your chance in strf(), the current
iteration is still not enough. How you know the idlest cpu is still
idlest after this function finished? how to ensure the allowed cpu won't
be changed again?

A quick snapshot is enough in balancing here. we still has periodic
balacning.

 
 * with your patch
1.the condition after find_idlest_cpu() does not exist,therefore
 a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
 the for_each_domain() loop).
2.in the next iteration, find_idlest_group() return NULL,because
 there is no cpu which intersects with tsk_allowed_cpus.
3.in select task rq,the fallback cpu is chosen even when an idle cpu
 existed.
 
 So my concern is though select_task_rq() checks the
 tsk_allowed_cpus(),you might end up choosing a different path of
 sched_domains compared to without this patch as shown above.
 
 In short without the if(new_cpu==-1) condition we might get misled
 doing unnecessary iterations over the wrong sched domains in
 select_task_rq_fair().(Think about situations when not all the cpus of
 socket2 are disallowed by the task,then there will more iterations in

After read the first 4 patches, believe you will find the patchset is
trying to reduce iterations, not increase them.

 the wrong path of sched_domains before exit,compared to what is shown
 above.)
 
 Regards
 Preeti U Murthy
 
 


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-11 Thread Preeti U Murthy
On 12/11/2012 05:23 PM, Alex Shi wrote:
 On 12/11/2012 02:30 PM, Preeti U Murthy wrote:
 On 12/11/2012 10:58 AM, Alex Shi wrote:
 On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?

 your worry make sense, but the code handle the situation, in
 select_task_rq(), it will check the cpu allowed again. if the answer is
 no, it will fallback to old cpu.

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.

 I doubt this will work correctly.Consider the following situation:sched
 domain begins with sd that encloses both socket1 and socket2

 cpu0 cpu1  | cpu2 cpu3
 ---|-
  socket1   |  socket2

 old cpu = cpu1

 Iteration1:
 1.find_idlest_group() returns socket2 to be idlest.
 2.task changes tsk_allowed_cpus to 0,1
 3.find_idlest_cpu() returns cpu2

 * without your patch
1.the condition after find_idlest_cpu() returns -1,and sd-child is
 chosen which happens to be socket1
2.in the next iteration, find_idlest_group() and find_idlest_cpu()
 will probably choose cpu0 which happens to be idler than cpu1,which is
 in tsk_allowed_cpu.
 
 Thanks for question Preeti! :)
 
 Yes, with more iteration you has more possibility to get task allowed
 cpu in select_task_rq_fair. but how many opportunity the situation
 happened?  how much gain you get here?
 With LCPU increasing many many iterations cause scalability issue. that
 is the simplified forking patchset for. and that why 10% performance
 gain on hackbench process/thread.
 
 and if you insist want not to miss your chance in strf(), the current
 iteration is still not enough. How you know the idlest cpu is still
 idlest after this function finished? how to ensure the allowed cpu won't
 be changed again?
 
 A quick snapshot is enough in balancing here. we still has periodic
 balacning.

Hmm ok,let me look at this more closely.
 

 * with your patch
1.the condition after find_idlest_cpu() does not exist,therefore
 a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
 the for_each_domain() loop).
2.in the next iteration, find_idlest_group() return NULL,because
 there is no cpu which intersects with tsk_allowed_cpus.
3.in select task rq,the fallback cpu is chosen even when an idle cpu
 existed.

 So my concern is though select_task_rq() checks the
 tsk_allowed_cpus(),you might end up choosing a different path of
 sched_domains compared to without this patch as shown above.

 In short without the if(new_cpu==-1) condition we might get misled
 doing unnecessary iterations over the wrong sched domains in
 select_task_rq_fair().(Think about situations when not all the cpus of
 socket2 are disallowed by the task,then there will more iterations in
 
 After read the first 4 patches, believe you will find the patchset is
 trying to reduce iterations, not increase them.

Right,sorry about not noticing this.
 
 the wrong path of sched_domains before exit,compared to what is shown
 above.)

Regards
Preeti U Murthy

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Preeti U Murthy
On 12/11/2012 10:58 AM, Alex Shi wrote:
> On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
>> Hi Alex,
>>
>> On 12/10/2012 01:52 PM, Alex Shi wrote:
>>> It is impossible to miss a task allowed cpu in a eligible group.
>>
>> The one thing I am concerned with here is if there is a possibility of
>> the task changing its tsk_cpus_allowed() while this code is running.
>>
>> i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
>> for the task changes,perhaps by the user himself,which might not include
>> the cpus in the idle group.After this find_idlest_cpu() is called.I mean
>> a race condition in short.Then we might not have an eligible cpu in that
>> group right?
> 
> your worry make sense, but the code handle the situation, in
> select_task_rq(), it will check the cpu allowed again. if the answer is
> no, it will fallback to old cpu.
>>
>>> And since find_idlest_group only return a different group which
>>> excludes old cpu, it's also imporissible to find a new cpu same as old
>>> cpu.

I doubt this will work correctly.Consider the following situation:sched
domain begins with sd that encloses both socket1 and socket2

cpu0 cpu1  | cpu2 cpu3
---|-
 socket1   |  socket2

old cpu = cpu1

Iteration1:
1.find_idlest_group() returns socket2 to be idlest.
2.task changes tsk_allowed_cpus to 0,1
3.find_idlest_cpu() returns cpu2

* without your patch
   1.the condition after find_idlest_cpu() returns -1,and sd->child is
chosen which happens to be socket1
   2.in the next iteration, find_idlest_group() and find_idlest_cpu()
will probably choose cpu0 which happens to be idler than cpu1,which is
in tsk_allowed_cpu.

* with your patch
   1.the condition after find_idlest_cpu() does not exist,therefore
a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
the for_each_domain() loop).
   2.in the next iteration, find_idlest_group() return NULL,because
there is no cpu which intersects with tsk_allowed_cpus.
   3.in select task rq,the fallback cpu is chosen even when an idle cpu
existed.

So my concern is though select_task_rq() checks the
tsk_allowed_cpus(),you might end up choosing a different path of
sched_domains compared to without this patch as shown above.

In short without the "if(new_cpu==-1)" condition we might get misled
doing unnecessary iterations over the wrong sched domains in
select_task_rq_fair().(Think about situations when not all the cpus of
socket2 are disallowed by the task,then there will more iterations in
the wrong path of sched_domains before exit,compared to what is shown
above.)

Regards
Preeti U Murthy


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Alex Shi
On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
> Hi Alex,
> 
> On 12/10/2012 01:52 PM, Alex Shi wrote:
>> It is impossible to miss a task allowed cpu in a eligible group.
> 
> The one thing I am concerned with here is if there is a possibility of
> the task changing its tsk_cpus_allowed() while this code is running.
> 
> i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
> for the task changes,perhaps by the user himself,which might not include
> the cpus in the idle group.After this find_idlest_cpu() is called.I mean
> a race condition in short.Then we might not have an eligible cpu in that
> group right?

your worry make sense, but the code handle the situation, in
select_task_rq(), it will check the cpu allowed again. if the answer is
no, it will fallback to old cpu.
> 
>> And since find_idlest_group only return a different group which
>> excludes old cpu, it's also imporissible to find a new cpu same as old
>> cpu.
> 
> This I agree with.
> 
>> Signed-off-by: Alex Shi 
>> ---
>>  kernel/sched/fair.c |5 -
>>  1 files changed, 0 insertions(+), 5 deletions(-)
>>
>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>> index 59e072b..df99456 100644
>> --- a/kernel/sched/fair.c
>> +++ b/kernel/sched/fair.c
>> @@ -3150,11 +3150,6 @@ select_task_rq_fair(struct task_struct *p, int 
>> sd_flag, int wake_flags)
>>  }
>>  
>>  new_cpu = find_idlest_cpu(group, p, cpu);
>> -if (new_cpu == -1 || new_cpu == cpu) {
>> -/* Now try balancing at a lower domain level of cpu */
>> -sd = sd->child;
>> -continue;
>> -}
>>  
>>  /* Now try balancing at a lower domain level of new_cpu */
>>  cpu = new_cpu;
>>
> Regards
> Preeti U Murthy
> 


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Preeti U Murthy
Hi Alex,

On 12/10/2012 01:52 PM, Alex Shi wrote:
> It is impossible to miss a task allowed cpu in a eligible group.

The one thing I am concerned with here is if there is a possibility of
the task changing its tsk_cpus_allowed() while this code is running.

i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
for the task changes,perhaps by the user himself,which might not include
the cpus in the idle group.After this find_idlest_cpu() is called.I mean
a race condition in short.Then we might not have an eligible cpu in that
group right?

> And since find_idlest_group only return a different group which
> excludes old cpu, it's also imporissible to find a new cpu same as old
> cpu.

This I agree with.

> Signed-off-by: Alex Shi 
> ---
>  kernel/sched/fair.c |5 -
>  1 files changed, 0 insertions(+), 5 deletions(-)
> 
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 59e072b..df99456 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -3150,11 +3150,6 @@ select_task_rq_fair(struct task_struct *p, int 
> sd_flag, int wake_flags)
>   }
>  
>   new_cpu = find_idlest_cpu(group, p, cpu);
> - if (new_cpu == -1 || new_cpu == cpu) {
> - /* Now try balancing at a lower domain level of cpu */
> - sd = sd->child;
> - continue;
> - }
>  
>   /* Now try balancing at a lower domain level of new_cpu */
>   cpu = new_cpu;
> 
Regards
Preeti U Murthy

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Preeti U Murthy
Hi Alex,

On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

The one thing I am concerned with here is if there is a possibility of
the task changing its tsk_cpus_allowed() while this code is running.

i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
for the task changes,perhaps by the user himself,which might not include
the cpus in the idle group.After this find_idlest_cpu() is called.I mean
a race condition in short.Then we might not have an eligible cpu in that
group right?

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.

This I agree with.

 Signed-off-by: Alex Shi alex@intel.com
 ---
  kernel/sched/fair.c |5 -
  1 files changed, 0 insertions(+), 5 deletions(-)
 
 diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
 index 59e072b..df99456 100644
 --- a/kernel/sched/fair.c
 +++ b/kernel/sched/fair.c
 @@ -3150,11 +3150,6 @@ select_task_rq_fair(struct task_struct *p, int 
 sd_flag, int wake_flags)
   }
  
   new_cpu = find_idlest_cpu(group, p, cpu);
 - if (new_cpu == -1 || new_cpu == cpu) {
 - /* Now try balancing at a lower domain level of cpu */
 - sd = sd-child;
 - continue;
 - }
  
   /* Now try balancing at a lower domain level of new_cpu */
   cpu = new_cpu;
 
Regards
Preeti U Murthy

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Alex Shi
On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,
 
 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.
 
 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.
 
 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?

your worry make sense, but the code handle the situation, in
select_task_rq(), it will check the cpu allowed again. if the answer is
no, it will fallback to old cpu.
 
 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.
 
 This I agree with.
 
 Signed-off-by: Alex Shi alex@intel.com
 ---
  kernel/sched/fair.c |5 -
  1 files changed, 0 insertions(+), 5 deletions(-)

 diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
 index 59e072b..df99456 100644
 --- a/kernel/sched/fair.c
 +++ b/kernel/sched/fair.c
 @@ -3150,11 +3150,6 @@ select_task_rq_fair(struct task_struct *p, int 
 sd_flag, int wake_flags)
  }
  
  new_cpu = find_idlest_cpu(group, p, cpu);
 -if (new_cpu == -1 || new_cpu == cpu) {
 -/* Now try balancing at a lower domain level of cpu */
 -sd = sd-child;
 -continue;
 -}
  
  /* Now try balancing at a lower domain level of new_cpu */
  cpu = new_cpu;

 Regards
 Preeti U Murthy
 


-- 
Thanks
Alex
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 01/18] sched: select_task_rq_fair clean up

2012-12-10 Thread Preeti U Murthy
On 12/11/2012 10:58 AM, Alex Shi wrote:
 On 12/11/2012 12:23 PM, Preeti U Murthy wrote:
 Hi Alex,

 On 12/10/2012 01:52 PM, Alex Shi wrote:
 It is impossible to miss a task allowed cpu in a eligible group.

 The one thing I am concerned with here is if there is a possibility of
 the task changing its tsk_cpus_allowed() while this code is running.

 i.e find_idlest_group() finds an idle group,then the tsk_cpus_allowed()
 for the task changes,perhaps by the user himself,which might not include
 the cpus in the idle group.After this find_idlest_cpu() is called.I mean
 a race condition in short.Then we might not have an eligible cpu in that
 group right?
 
 your worry make sense, but the code handle the situation, in
 select_task_rq(), it will check the cpu allowed again. if the answer is
 no, it will fallback to old cpu.

 And since find_idlest_group only return a different group which
 excludes old cpu, it's also imporissible to find a new cpu same as old
 cpu.

I doubt this will work correctly.Consider the following situation:sched
domain begins with sd that encloses both socket1 and socket2

cpu0 cpu1  | cpu2 cpu3
---|-
 socket1   |  socket2

old cpu = cpu1

Iteration1:
1.find_idlest_group() returns socket2 to be idlest.
2.task changes tsk_allowed_cpus to 0,1
3.find_idlest_cpu() returns cpu2

* without your patch
   1.the condition after find_idlest_cpu() returns -1,and sd-child is
chosen which happens to be socket1
   2.in the next iteration, find_idlest_group() and find_idlest_cpu()
will probably choose cpu0 which happens to be idler than cpu1,which is
in tsk_allowed_cpu.

* with your patch
   1.the condition after find_idlest_cpu() does not exist,therefore
a sched domain to which cpu2 belongs to is chosen.this is socket2.(under
the for_each_domain() loop).
   2.in the next iteration, find_idlest_group() return NULL,because
there is no cpu which intersects with tsk_allowed_cpus.
   3.in select task rq,the fallback cpu is chosen even when an idle cpu
existed.

So my concern is though select_task_rq() checks the
tsk_allowed_cpus(),you might end up choosing a different path of
sched_domains compared to without this patch as shown above.

In short without the if(new_cpu==-1) condition we might get misled
doing unnecessary iterations over the wrong sched domains in
select_task_rq_fair().(Think about situations when not all the cpus of
socket2 are disallowed by the task,then there will more iterations in
the wrong path of sched_domains before exit,compared to what is shown
above.)

Regards
Preeti U Murthy


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/