Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Preeti U Murthy
On 05/14/2015 04:29 AM, Kevin Hilman wrote:
 Rafael J. Wysocki r...@rjwysocki.net writes:
 
 [...]
 
 Second, quite honestly, I don't see a connection to genpd here.
 
 The connection with genpd is because the *reason* the timer was
 shutdown/stopped is because it shares power with the CPU, which is why
 the timer stops when the CPU hits ceratin low power states.  IOW, it's
 in the same power domain as the CPU.
 
 What you seem to be saying is maybe we can eliminate the need to check the
 return value of tick_broadcast_enter() in the idle loop if we proactively
 disable the TIMER_STOP idle states of a CPU when we start to use that CPU's
 timer as a broadcast one.

 So this seems to be about the timekeeping rather than power domains, because
 that's where the broadcast thing is done.  So the code setting up the CPU's
 timer for broadcast would pretty much need to pause cpuidle, go through the
 CPU's idle states and disable the TIMER_STOP ones.  And do the reverse when 
 the
 timer is not going the be used for broadcast any more.  
 
 Or..., modify the timer subystem to use runtime PM on the timer devices,
 create a genpd that includes the timer device, and use
 pm_genpd_attach_cpuidle() to attach that genpd so that whenever that
 timer is runtime PM active, the deeper C-states cannot be hit.

I think you are missing a point here. If such a solution were possible,
the tick broadcast framework would not have been designed to support
deep cpu idle states. One reason we cannot go this way of course, is not
all archs may support genpd as was pointed out. But the second reason
IMO is that a timer is runtime PM active as long as there is some
deferred work, either in the near or far future.

The point behind the broadcast framework is let these CPUs go to deeper
idle states when the timers are in the far future. We can potentially
save power by doing so and don't need to keep the entire power domain
active just because the timer is supposed to fire 5 minutes from now,
which is precisely what happens if we go the genpd way.

Hence I don't think we can trivially club timers with genpd unless we
have a way to power the timer PM domain down, depending on when it is
supposed to fire, in which case we will merely be replicating the
cpuidle governor code.

Regards
Preeti U Murthy

 
 So question is whether or not this is actually really more
 straightforward than checking the return value of
 tick_broadcast_enter() in the idle loop after all.
 
 Unfortunetly this problem doesn't only affect timers.
 
 Daniel's broader point is that $SUBJECT series only handles this for the
 timer, but there's actually a more general problem to solve for *any*
 device that shares a power domain with a CPU (e.g. CPU-local
 timers, interrupt controllers, performance monitoring units, floating
 point units, etc. etc.)
 
 If we keep adding checks to the idle loop for all those devices, we're
 heading for a mess.  (In fact, this is exactly what CPUidle drivers in
 lots of vendor trees are doing, and it is indeed quite messy, and very
 vendor specific.)
 
 Also, solving this more general problem was the primary motivation for
 adding the gnpd _attach_cpuidle() feature in the first place, so why not
 use that?
 
 Longer term, IMO, these dependencies between CPUs and all these extras
 logic that share a power domain should be modeled by a genpd.  If all
 those devices are using runtime PM, including the CPUs, and they are
 grouped into a genpd, then we we can very easily know at the genpd level
 whether or not the CPU could be powered down, and to what level.  This
 longer-term solution is what I want to discuss at LPC this year in my
 Unifiy idle management of CPUs and IO devices topic[1].  ( Also FYI,
 using a genpd to model a CPU and connected logic is part of the
 motivation behind the recent proposals to add support for multiple
 states to genpd by Axel Haslam. )
 
 Anyways I digress...
 
 In the short term, while your patches look fine to me, the objection I
 have is that it's only a band-aid fix that handles timers, but none of
 the other extras that might share a power rail with the CPU.  So,
 until we have the long-term stuff sorted out, the better
 short-term solution IMO is the _attach_cpuidle() one above.
 
 Kevin
 
 [1] http://wiki.linuxplumbersconf.org/2015:energy-aware_scheduling
 ___
 Linuxppc-dev mailing list
 Linuxppc-dev@lists.ozlabs.org
 https://lists.ozlabs.org/listinfo/linuxppc-dev
 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Rafael J. Wysocki
On Wednesday, May 13, 2015 05:13:27 PM Kevin Hilman wrote:
 On Wed, May 13, 2015 at 5:16 PM, Rafael J. Wysocki r...@rjwysocki.net wrote:
  On Wednesday, May 13, 2015 03:59:55 PM Kevin Hilman wrote:
  Rafael J. Wysocki r...@rjwysocki.net writes:
 
  [...]
 
   Second, quite honestly, I don't see a connection to genpd here.
 
  The connection with genpd is because the *reason* the timer was
  shutdown/stopped is because it shares power with the CPU, which is why
  the timer stops when the CPU hits ceratin low power states.  IOW, it's
  in the same power domain as the CPU.
 
  Well, what if you don't have genpd on that system?  Is the problem at hand 
  not
  relevant then magically?
 
 Well, if you're not using genpd to model hardware power domain
 dependencies, then yes you'll definitely need a different solution.
 
 And, as we discussed on IRC.  If you only care about timers, and genpd
 is not in use, then $SUBJECT series is a fine approach, and I have no
 objections.  But for SoCs where there are several other things that
 share power with CPU, we need a more generic, genpd based solution,
 which it seems we're in agreement on.  And since the two approaches
 are not mutually exclusive, then I have real objections to applying
 this series.

I guess a no is missing in the last sentence. ;-)

 Acked-by: Kevin Hilman khil...@linaro.org

Thanks!

Rafael

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Rafael J. Wysocki
On Wednesday, May 13, 2015 03:59:55 PM Kevin Hilman wrote:
 Rafael J. Wysocki r...@rjwysocki.net writes:
 
 [...]
 
  Second, quite honestly, I don't see a connection to genpd here.
 
 The connection with genpd is because the *reason* the timer was
 shutdown/stopped is because it shares power with the CPU, which is why
 the timer stops when the CPU hits ceratin low power states.  IOW, it's
 in the same power domain as the CPU.

Well, what if you don't have genpd on that system?  Is the problem at hand not
relevant then magically?

Rafael

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Kevin Hilman
On Wed, May 13, 2015 at 5:16 PM, Rafael J. Wysocki r...@rjwysocki.net wrote:
 On Wednesday, May 13, 2015 03:59:55 PM Kevin Hilman wrote:
 Rafael J. Wysocki r...@rjwysocki.net writes:

 [...]

  Second, quite honestly, I don't see a connection to genpd here.

 The connection with genpd is because the *reason* the timer was
 shutdown/stopped is because it shares power with the CPU, which is why
 the timer stops when the CPU hits ceratin low power states.  IOW, it's
 in the same power domain as the CPU.

 Well, what if you don't have genpd on that system?  Is the problem at hand not
 relevant then magically?

Well, if you're not using genpd to model hardware power domain
dependencies, then yes you'll definitely need a different solution.

And, as we discussed on IRC.  If you only care about timers, and genpd
is not in use, then $SUBJECT series is a fine approach, and I have no
objections.  But for SoCs where there are several other things that
share power with CPU, we need a more generic, genpd based solution,
which it seems we're in agreement on.  And since the two approaches
are not mutually exclusive, then I have real objections to applying
this series.

Acked-by: Kevin Hilman khil...@linaro.org

Kevin
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Kevin Hilman
Rafael J. Wysocki r...@rjwysocki.net writes:

[...]

 Second, quite honestly, I don't see a connection to genpd here.

The connection with genpd is because the *reason* the timer was
shutdown/stopped is because it shares power with the CPU, which is why
the timer stops when the CPU hits ceratin low power states.  IOW, it's
in the same power domain as the CPU.

 What you seem to be saying is maybe we can eliminate the need to check the
 return value of tick_broadcast_enter() in the idle loop if we proactively
 disable the TIMER_STOP idle states of a CPU when we start to use that CPU's
 timer as a broadcast one.

 So this seems to be about the timekeeping rather than power domains, because
 that's where the broadcast thing is done.  So the code setting up the CPU's
 timer for broadcast would pretty much need to pause cpuidle, go through the
 CPU's idle states and disable the TIMER_STOP ones.  And do the reverse when 
 the
 timer is not going the be used for broadcast any more.  

Or..., modify the timer subystem to use runtime PM on the timer devices,
create a genpd that includes the timer device, and use
pm_genpd_attach_cpuidle() to attach that genpd so that whenever that
timer is runtime PM active, the deeper C-states cannot be hit.

 So question is whether or not this is actually really more
 straightforward than checking the return value of
 tick_broadcast_enter() in the idle loop after all.

Unfortunetly this problem doesn't only affect timers.

Daniel's broader point is that $SUBJECT series only handles this for the
timer, but there's actually a more general problem to solve for *any*
device that shares a power domain with a CPU (e.g. CPU-local
timers, interrupt controllers, performance monitoring units, floating
point units, etc. etc.)

If we keep adding checks to the idle loop for all those devices, we're
heading for a mess.  (In fact, this is exactly what CPUidle drivers in
lots of vendor trees are doing, and it is indeed quite messy, and very
vendor specific.)

Also, solving this more general problem was the primary motivation for
adding the gnpd _attach_cpuidle() feature in the first place, so why not
use that?

Longer term, IMO, these dependencies between CPUs and all these extras
logic that share a power domain should be modeled by a genpd.  If all
those devices are using runtime PM, including the CPUs, and they are
grouped into a genpd, then we we can very easily know at the genpd level
whether or not the CPU could be powered down, and to what level.  This
longer-term solution is what I want to discuss at LPC this year in my
Unifiy idle management of CPUs and IO devices topic[1].  ( Also FYI,
using a genpd to model a CPU and connected logic is part of the
motivation behind the recent proposals to add support for multiple
states to genpd by Axel Haslam. )

Anyways I digress...

In the short term, while your patches look fine to me, the objection I
have is that it's only a band-aid fix that handles timers, but none of
the other extras that might share a power rail with the CPU.  So,
until we have the long-term stuff sorted out, the better
short-term solution IMO is the _attach_cpuidle() one above.

Kevin

[1] http://wiki.linuxplumbersconf.org/2015:energy-aware_scheduling
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-13 Thread Kevin Hilman
Rafael J. Wysocki r...@rjwysocki.net writes:

 On Wednesday, May 13, 2015 05:13:27 PM Kevin Hilman wrote:
 On Wed, May 13, 2015 at 5:16 PM, Rafael J. Wysocki r...@rjwysocki.net 
 wrote:
  On Wednesday, May 13, 2015 03:59:55 PM Kevin Hilman wrote:
  Rafael J. Wysocki r...@rjwysocki.net writes:
 
  [...]
 
   Second, quite honestly, I don't see a connection to genpd here.
 
  The connection with genpd is because the *reason* the timer was
  shutdown/stopped is because it shares power with the CPU, which is why
  the timer stops when the CPU hits ceratin low power states.  IOW, it's
  in the same power domain as the CPU.
 
  Well, what if you don't have genpd on that system?  Is the problem at hand 
  not
  relevant then magically?
 
 Well, if you're not using genpd to model hardware power domain
 dependencies, then yes you'll definitely need a different solution.
 
 And, as we discussed on IRC.  If you only care about timers, and genpd
 is not in use, then $SUBJECT series is a fine approach, and I have no
 objections.  But for SoCs where there are several other things that
 share power with CPU, we need a more generic, genpd based solution,
 which it seems we're in agreement on.  And since the two approaches
 are not mutually exclusive, then I have real objections to applying
 this series.

 I guess a no is missing in the last sentence. ;-)

Correct.  I have *no* real objections to applying this series.

Kevin

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-12 Thread Daniel Lezcano

On 05/12/2015 01:31 AM, Rafael J. Wysocki wrote:

On Monday, May 11, 2015 07:40:41 PM Daniel Lezcano wrote:

On 05/10/2015 01:15 AM, Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:

Hi Rafael,

On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:


[cut]



+   /* Take note of the planned idle state. */
+   idle_set_state(smp_processor_id(), target_state);


And I wouldn't do this either.

The behavior here is pretty much as though the driver demoted the state chosen
by the governor and we don't call idle_set_state() again in those cases.


Why is this wrong?


It is not wrong, but incomplete, because demotions done by the cpuidle driver
should also be taken into account in the same way.

But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
call default_idle_call() was a mistake, because it might confuse 
find_idlest_cpu()
significantly as to what state the CPU is in.  I'll drop that one for now.


OK, done.

So after I've dropped it I think we need to do three things:
(1) Move the idle_set_state() calls to cpuidle_enter_state().
(2) Make cpuidle_enter_state() call default_idle_call() again, but this time
  do that *before* it has called idle_set_state() for target_state.
(3) Introduce demotion as per my last patch.

Let me cut patches for that.


Done as per the above and the patches follow in replies to this messge.

All on top of the current linux-next branch of the linux-pm.git tree.


IMO the resulting code is more and more confusing.


Why is it confusing?

What part of it is confusing?

Patches [1-2/3] simply replace https://patchwork.kernel.org/patch/6326761/
and I'm not sure why that would be confusing.

Patch [3/3] simply causes cpuidle_enter_state() to pick up a more suitable
state if tick_broadcast_enter() fails instead of returning an error code
in that case.  What exactly is confusing in that?


Except I miss something, the tick_broadcast_enter can fail only if the
local timer of the current cpu is used as a broadcast timer (which is
the case today for PPC only).


well, why does this matter?


The correct fix would be to tie this local timer with the cpu power
domain and disable the idle state powering down this domain like it was
done for the renesas cpuidle driver.

IOW, the cpu power domain is in use (because of its local timer), so we
shouldn't shut it down.

No ?


Sorry, I'm not sure what you're talking about.

The problem at hand is that tick_broadcast_enter() can fail and we need to
handle that.  If we can prevent it from ever failing, that would be awesome,
but quite honestly I don't see how to do that ATM.


Ok, sorry. Let me clarify.

You did a mechanism two years ago with pm_genpd_attach_cpuidle and 
power_on/off. That disables a cpuidle state when a power domain is in use.


The idea I was proposing is to reuse this approach.

The logic is:

The local timer is in use, this idle state power downs this timer, then 
disable it.


So it is when the broadcast timer is 'bound_on' a cpu, we disable the 
idle states. That could be done via a loop looking for the TIMER_STOP 
flag or via the power domain.


Hence the cpuidle_select will never return a state which powers downs 
the local cpu (because they are disabled) and tick_broadcast_enter can't 
fail because it is never called.


Does it make more sense ?


I am aware this is not easily fixable because the genpd framework is
incomplete and has some restrictions but I believe it is worth to have a
discussion. Add Kevin and Ulf in Cc.


So I'm going to queue up these patches for 4.2 and we can have a discussion
just fine regardless.




--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-12 Thread Daniel Lezcano

On 05/12/2015 03:23 PM, Rafael J. Wysocki wrote:

On Tuesday, May 12, 2015 10:41:35 AM Daniel Lezcano wrote:

On 05/12/2015 01:31 AM, Rafael J. Wysocki wrote:

On Monday, May 11, 2015 07:40:41 PM Daniel Lezcano wrote:

On 05/10/2015 01:15 AM, Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:

Hi Rafael,

On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:


[cut]



+   /* Take note of the planned idle state. */
+   idle_set_state(smp_processor_id(), target_state);


And I wouldn't do this either.

The behavior here is pretty much as though the driver demoted the state chosen
by the governor and we don't call idle_set_state() again in those cases.


Why is this wrong?


It is not wrong, but incomplete, because demotions done by the cpuidle driver
should also be taken into account in the same way.

But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
call default_idle_call() was a mistake, because it might confuse 
find_idlest_cpu()
significantly as to what state the CPU is in.  I'll drop that one for now.


OK, done.

So after I've dropped it I think we need to do three things:
(1) Move the idle_set_state() calls to cpuidle_enter_state().
(2) Make cpuidle_enter_state() call default_idle_call() again, but this time
   do that *before* it has called idle_set_state() for target_state.
(3) Introduce demotion as per my last patch.

Let me cut patches for that.


Done as per the above and the patches follow in replies to this messge.

All on top of the current linux-next branch of the linux-pm.git tree.


IMO the resulting code is more and more confusing.


Why is it confusing?

What part of it is confusing?

Patches [1-2/3] simply replace https://patchwork.kernel.org/patch/6326761/
and I'm not sure why that would be confusing.

Patch [3/3] simply causes cpuidle_enter_state() to pick up a more suitable
state if tick_broadcast_enter() fails instead of returning an error code
in that case.  What exactly is confusing in that?


Except I miss something, the tick_broadcast_enter can fail only if the
local timer of the current cpu is used as a broadcast timer (which is
the case today for PPC only).


well, why does this matter?


The correct fix would be to tie this local timer with the cpu power
domain and disable the idle state powering down this domain like it was
done for the renesas cpuidle driver.

IOW, the cpu power domain is in use (because of its local timer), so we
shouldn't shut it down.

No ?


Sorry, I'm not sure what you're talking about.

The problem at hand is that tick_broadcast_enter() can fail and we need to
handle that.  If we can prevent it from ever failing, that would be awesome,
but quite honestly I don't see how to do that ATM.


Ok, sorry. Let me clarify.

You did a mechanism two years ago with pm_genpd_attach_cpuidle and
power_on/off. That disables a cpuidle state when a power domain is in use.

The idea I was proposing is to reuse this approach.

The logic is:

The local timer is in use, this idle state power downs this timer, then
disable it.


I'm not sure it's about powering down.  Stopping rather (which may or may
not involve powering down).


So it is when the broadcast timer is 'bound_on' a cpu, we disable the
idle states. That could be done via a loop looking for the TIMER_STOP
flag or via the power domain.

Hence the cpuidle_select will never return a state which powers downs
the local cpu (because they are disabled) and tick_broadcast_enter can't
fail because it is never called.

Does it make more sense ?


Well, you've not explained what's confusing in the code after this series
in the first place. :-)


It is not the series itself but the sum of the recent changes in this 
area makes the overall more and more difficult to maintain. But that's a 
personal opinion. Sounds like we are trying to catch the corner cases 
each time there is a change somewhere.



Second, quite honestly, I don't see a connection to genpd here.


Probably I am not clear :)

The connection we have is the local timer and the cpuidle framework 
shutting it down. Why ? Because the local timer belongs to the cpu's 
power domain.


Using the genpd to describe this relation between an idle state and the 
devices impacted by via a power domain is, in my opinion, a nice 
abstraction and a good opportunity to integrate the different 
subsystems. Furthermore it is consistent with Kevin's investigation 
around the power domain and SoC idle.


Kevin ?


What you seem to be saying is maybe we can eliminate the need to check the
return value of tick_broadcast_enter() in the idle loop if we proactively
disable the TIMER_STOP idle states of a CPU when we start to use that CPU's
timer as a broadcast one.


Well, not exactly. That's the consequence.

I meant, using any devices in a specific power domain makes impossible 
to 

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-12 Thread Rafael J. Wysocki
On Tuesday, May 12, 2015 10:41:35 AM Daniel Lezcano wrote:
 On 05/12/2015 01:31 AM, Rafael J. Wysocki wrote:
  On Monday, May 11, 2015 07:40:41 PM Daniel Lezcano wrote:
  On 05/10/2015 01:15 AM, Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
  Hi Rafael,
 
  On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:
 
  [cut]
 
 
  +/* Take note of the planned idle state. */
  +idle_set_state(smp_processor_id(), target_state);
 
  And I wouldn't do this either.
 
  The behavior here is pretty much as though the driver demoted the 
  state chosen
  by the governor and we don't call idle_set_state() again in those 
  cases.
 
  Why is this wrong?
 
  It is not wrong, but incomplete, because demotions done by the 
  cpuidle driver
  should also be taken into account in the same way.
 
  But I'm seeing that the recent patch of mine that made 
  cpuidle_enter_state()
  call default_idle_call() was a mistake, because it might confuse 
  find_idlest_cpu()
  significantly as to what state the CPU is in.  I'll drop that one for 
  now.
 
  OK, done.
 
  So after I've dropped it I think we need to do three things:
  (1) Move the idle_set_state() calls to cpuidle_enter_state().
  (2) Make cpuidle_enter_state() call default_idle_call() again, but this 
  time
do that *before* it has called idle_set_state() for target_state.
  (3) Introduce demotion as per my last patch.
 
  Let me cut patches for that.
 
  Done as per the above and the patches follow in replies to this messge.
 
  All on top of the current linux-next branch of the linux-pm.git tree.
 
  IMO the resulting code is more and more confusing.
 
  Why is it confusing?
 
  What part of it is confusing?
 
  Patches [1-2/3] simply replace https://patchwork.kernel.org/patch/6326761/
  and I'm not sure why that would be confusing.
 
  Patch [3/3] simply causes cpuidle_enter_state() to pick up a more suitable
  state if tick_broadcast_enter() fails instead of returning an error code
  in that case.  What exactly is confusing in that?
 
  Except I miss something, the tick_broadcast_enter can fail only if the
  local timer of the current cpu is used as a broadcast timer (which is
  the case today for PPC only).
 
  well, why does this matter?
 
  The correct fix would be to tie this local timer with the cpu power
  domain and disable the idle state powering down this domain like it was
  done for the renesas cpuidle driver.
 
  IOW, the cpu power domain is in use (because of its local timer), so we
  shouldn't shut it down.
 
  No ?
 
  Sorry, I'm not sure what you're talking about.
 
  The problem at hand is that tick_broadcast_enter() can fail and we need to
  handle that.  If we can prevent it from ever failing, that would be awesome,
  but quite honestly I don't see how to do that ATM.
 
 Ok, sorry. Let me clarify.
 
 You did a mechanism two years ago with pm_genpd_attach_cpuidle and 
 power_on/off. That disables a cpuidle state when a power domain is in use.
 
 The idea I was proposing is to reuse this approach.
 
 The logic is:
 
 The local timer is in use, this idle state power downs this timer, then 
 disable it.

I'm not sure it's about powering down.  Stopping rather (which may or may
not involve powering down).

 So it is when the broadcast timer is 'bound_on' a cpu, we disable the 
 idle states. That could be done via a loop looking for the TIMER_STOP 
 flag or via the power domain.
 
 Hence the cpuidle_select will never return a state which powers downs 
 the local cpu (because they are disabled) and tick_broadcast_enter can't 
 fail because it is never called.
 
 Does it make more sense ?

Well, you've not explained what's confusing in the code after this series
in the first place. :-)

Second, quite honestly, I don't see a connection to genpd here.

What you seem to be saying is maybe we can eliminate the need to check the
return value of tick_broadcast_enter() in the idle loop if we proactively
disable the TIMER_STOP idle states of a CPU when we start to use that CPU's
timer as a broadcast one.

So this seems to be about the timekeeping rather than power domains, because
that's where the broadcast thing is done.  So the code setting up the CPU's
timer for broadcast would pretty much need to pause cpuidle, go through the
CPU's idle states and disable the TIMER_STOP ones.  And do the reverse when the
timer is not going the be used for broadcast any more.  So question is whether
or not this is actually really more straightforward than checking the return
value of tick_broadcast_enter() in the idle loop after all.


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-11 Thread Sudeep Holla



On 10/05/15 00:15, Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:

Hi Rafael,

On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:


[cut]



+   /* Take note of the planned idle state. */
+   idle_set_state(smp_processor_id(), target_state);


And I wouldn't do this either.

The behavior here is pretty much as though the driver demoted the state chosen
by the governor and we don't call idle_set_state() again in those cases.


Why is this wrong?


It is not wrong, but incomplete, because demotions done by the cpuidle driver
should also be taken into account in the same way.

But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
call default_idle_call() was a mistake, because it might confuse 
find_idlest_cpu()
significantly as to what state the CPU is in.  I'll drop that one for now.


OK, done.

So after I've dropped it I think we need to do three things:
(1) Move the idle_set_state() calls to cpuidle_enter_state().
(2) Make cpuidle_enter_state() call default_idle_call() again, but this time
 do that *before* it has called idle_set_state() for target_state.
(3) Introduce demotion as per my last patch.

Let me cut patches for that.


Done as per the above and the patches follow in replies to this messge.

All on top of the current linux-next branch of the linux-pm.git tree.



Tested on ARM Vexpress platforms with one of the CPU in broadcast mode
and also with broadcast timer. So, you can add:

Tested-by: Sudeep Holla sudeep.ho...@arm.com

Regards,
Sudeep
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-11 Thread Rafael J. Wysocki
On Monday, May 11, 2015 10:51:02 AM Preeti U Murthy wrote:
 On 05/10/2015 04:45 AM, Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
  Hi Rafael,
 
  On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:
 
  [cut]
 
   
  +  /* Take note of the planned idle state. */
  +  idle_set_state(smp_processor_id(), target_state);
 
  And I wouldn't do this either.
 
  The behavior here is pretty much as though the driver demoted the state 
  chosen
  by the governor and we don't call idle_set_state() again in those cases.
 
  Why is this wrong?
 
  It is not wrong, but incomplete, because demotions done by the cpuidle 
  driver
  should also be taken into account in the same way.
 
  But I'm seeing that the recent patch of mine that made 
  cpuidle_enter_state()
  call default_idle_call() was a mistake, because it might confuse 
  find_idlest_cpu()
  significantly as to what state the CPU is in.  I'll drop that one for now.
 
  OK, done.
 
  So after I've dropped it I think we need to do three things:
  (1) Move the idle_set_state() calls to cpuidle_enter_state().
  (2) Make cpuidle_enter_state() call default_idle_call() again, but this 
  time
  do that *before* it has called idle_set_state() for target_state.
  (3) Introduce demotion as per my last patch.
 
  Let me cut patches for that.
  
  Done as per the above and the patches follow in replies to this messge.
  
  All on top of the current linux-next branch of the linux-pm.git tree.
 
 The patches look good. Based and tested these patches on top of
 linux-pm/linux-next (They are not yet in the branch as far as I can see.)

They aren't in the tree yet.  I'll put them in there later today.

 All patches in this series
 Reviewed and Tested-by: Preeti U Murthy pre...@linux.vnet.ibm.com

Thanks!

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-11 Thread Rafael J. Wysocki
On Monday, May 11, 2015 04:13:37 PM Sudeep Holla wrote:
 
 On 10/05/15 00:15, Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
  Hi Rafael,
 
  On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:
 
  [cut]
 
 
  +  /* Take note of the planned idle state. */
  +  idle_set_state(smp_processor_id(), target_state);
 
  And I wouldn't do this either.
 
  The behavior here is pretty much as though the driver demoted the state 
  chosen
  by the governor and we don't call idle_set_state() again in those cases.
 
  Why is this wrong?
 
  It is not wrong, but incomplete, because demotions done by the cpuidle 
  driver
  should also be taken into account in the same way.
 
  But I'm seeing that the recent patch of mine that made 
  cpuidle_enter_state()
  call default_idle_call() was a mistake, because it might confuse 
  find_idlest_cpu()
  significantly as to what state the CPU is in.  I'll drop that one for now.
 
  OK, done.
 
  So after I've dropped it I think we need to do three things:
  (1) Move the idle_set_state() calls to cpuidle_enter_state().
  (2) Make cpuidle_enter_state() call default_idle_call() again, but this 
  time
   do that *before* it has called idle_set_state() for target_state.
  (3) Introduce demotion as per my last patch.
 
  Let me cut patches for that.
 
  Done as per the above and the patches follow in replies to this messge.
 
  All on top of the current linux-next branch of the linux-pm.git tree.
 
 
 Tested on ARM Vexpress platforms with one of the CPU in broadcast mode
 and also with broadcast timer. So, you can add:
 
 Tested-by: Sudeep Holla sudeep.ho...@arm.com

Thanks!

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-11 Thread Rafael J. Wysocki
On Monday, May 11, 2015 07:40:41 PM Daniel Lezcano wrote:
 On 05/10/2015 01:15 AM, Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
  Hi Rafael,
 
  On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:
 
  [cut]
 
 
  +  /* Take note of the planned idle state. */
  +  idle_set_state(smp_processor_id(), target_state);
 
  And I wouldn't do this either.
 
  The behavior here is pretty much as though the driver demoted the state 
  chosen
  by the governor and we don't call idle_set_state() again in those cases.
 
  Why is this wrong?
 
  It is not wrong, but incomplete, because demotions done by the cpuidle 
  driver
  should also be taken into account in the same way.
 
  But I'm seeing that the recent patch of mine that made 
  cpuidle_enter_state()
  call default_idle_call() was a mistake, because it might confuse 
  find_idlest_cpu()
  significantly as to what state the CPU is in.  I'll drop that one for now.
 
  OK, done.
 
  So after I've dropped it I think we need to do three things:
  (1) Move the idle_set_state() calls to cpuidle_enter_state().
  (2) Make cpuidle_enter_state() call default_idle_call() again, but this 
  time
   do that *before* it has called idle_set_state() for target_state.
  (3) Introduce demotion as per my last patch.
 
  Let me cut patches for that.
 
  Done as per the above and the patches follow in replies to this messge.
 
  All on top of the current linux-next branch of the linux-pm.git tree.
 
 IMO the resulting code is more and more confusing.

Why is it confusing?

What part of it is confusing?

Patches [1-2/3] simply replace https://patchwork.kernel.org/patch/6326761/
and I'm not sure why that would be confusing.

Patch [3/3] simply causes cpuidle_enter_state() to pick up a more suitable
state if tick_broadcast_enter() fails instead of returning an error code
in that case.  What exactly is confusing in that?

 Except I miss something, the tick_broadcast_enter can fail only if the 
 local timer of the current cpu is used as a broadcast timer (which is 
 the case today for PPC only).

well, why does this matter?

 The correct fix would be to tie this local timer with the cpu power 
 domain and disable the idle state powering down this domain like it was 
 done for the renesas cpuidle driver.
 
 IOW, the cpu power domain is in use (because of its local timer), so we 
 shouldn't shut it down.
 
 No ?

Sorry, I'm not sure what you're talking about.

The problem at hand is that tick_broadcast_enter() can fail and we need to
handle that.  If we can prevent it from ever failing, that would be awesome,
but quite honestly I don't see how to do that ATM.

 I am aware this is not easily fixable because the genpd framework is 
 incomplete and has some restrictions but I believe it is worth to have a 
 discussion. Add Kevin and Ulf in Cc.

So I'm going to queue up these patches for 4.2 and we can have a discussion
just fine regardless.


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-11 Thread Daniel Lezcano

On 05/10/2015 01:15 AM, Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:

On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:

Hi Rafael,

On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:


[cut]



+   /* Take note of the planned idle state. */
+   idle_set_state(smp_processor_id(), target_state);


And I wouldn't do this either.

The behavior here is pretty much as though the driver demoted the state chosen
by the governor and we don't call idle_set_state() again in those cases.


Why is this wrong?


It is not wrong, but incomplete, because demotions done by the cpuidle driver
should also be taken into account in the same way.

But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
call default_idle_call() was a mistake, because it might confuse 
find_idlest_cpu()
significantly as to what state the CPU is in.  I'll drop that one for now.


OK, done.

So after I've dropped it I think we need to do three things:
(1) Move the idle_set_state() calls to cpuidle_enter_state().
(2) Make cpuidle_enter_state() call default_idle_call() again, but this time
 do that *before* it has called idle_set_state() for target_state.
(3) Introduce demotion as per my last patch.

Let me cut patches for that.


Done as per the above and the patches follow in replies to this messge.

All on top of the current linux-next branch of the linux-pm.git tree.


IMO the resulting code is more and more confusing.

Except I miss something, the tick_broadcast_enter can fail only if the 
local timer of the current cpu is used as a broadcast timer (which is 
the case today for PPC only).


The correct fix would be to tie this local timer with the cpu power 
domain and disable the idle state powering down this domain like it was 
done for the renesas cpuidle driver.


IOW, the cpu power domain is in use (because of its local timer), so we 
shouldn't shut it down.


No ?

I am aware this is not easily fixable because the genpd framework is 
incomplete and has some restrictions but I believe it is worth to have a 
discussion. Add Kevin and Ulf in Cc.


  -- Daniel

--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-10 Thread Preeti U Murthy
On 05/10/2015 04:45 AM, Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
 Hi Rafael,

 On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:

 [cut]

  
 +/* Take note of the planned idle state. */
 +idle_set_state(smp_processor_id(), target_state);

 And I wouldn't do this either.

 The behavior here is pretty much as though the driver demoted the state 
 chosen
 by the governor and we don't call idle_set_state() again in those cases.

 Why is this wrong?

 It is not wrong, but incomplete, because demotions done by the cpuidle 
 driver
 should also be taken into account in the same way.

 But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
 call default_idle_call() was a mistake, because it might confuse 
 find_idlest_cpu()
 significantly as to what state the CPU is in.  I'll drop that one for now.

 OK, done.

 So after I've dropped it I think we need to do three things:
 (1) Move the idle_set_state() calls to cpuidle_enter_state().
 (2) Make cpuidle_enter_state() call default_idle_call() again, but this time
 do that *before* it has called idle_set_state() for target_state.
 (3) Introduce demotion as per my last patch.

 Let me cut patches for that.
 
 Done as per the above and the patches follow in replies to this messge.
 
 All on top of the current linux-next branch of the linux-pm.git tree.

I don't see the patches on linux-pm/linux-next.

Regards
Preeti U Murthy
 
 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-10 Thread Preeti U Murthy
On 05/10/2015 04:45 AM, Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
 Hi Rafael,

 On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:

 [cut]

  
 +/* Take note of the planned idle state. */
 +idle_set_state(smp_processor_id(), target_state);

 And I wouldn't do this either.

 The behavior here is pretty much as though the driver demoted the state 
 chosen
 by the governor and we don't call idle_set_state() again in those cases.

 Why is this wrong?

 It is not wrong, but incomplete, because demotions done by the cpuidle 
 driver
 should also be taken into account in the same way.

 But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
 call default_idle_call() was a mistake, because it might confuse 
 find_idlest_cpu()
 significantly as to what state the CPU is in.  I'll drop that one for now.

 OK, done.

 So after I've dropped it I think we need to do three things:
 (1) Move the idle_set_state() calls to cpuidle_enter_state().
 (2) Make cpuidle_enter_state() call default_idle_call() again, but this time
 do that *before* it has called idle_set_state() for target_state.
 (3) Introduce demotion as per my last patch.

 Let me cut patches for that.
 
 Done as per the above and the patches follow in replies to this messge.
 
 All on top of the current linux-next branch of the linux-pm.git tree.

The patches look good. Based and tested these patches on top of
linux-pm/linux-next (They are not yet in the branch as far as I can see.)

All patches in this series
Reviewed and Tested-by: Preeti U Murthy pre...@linux.vnet.ibm.com
 
 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH 0/3] cpuidle: updates related to tick_broadcast_enter() failures

2015-05-09 Thread Rafael J. Wysocki
On Saturday, May 09, 2015 10:33:05 PM Rafael J. Wysocki wrote:
 On Saturday, May 09, 2015 10:11:41 PM Rafael J. Wysocki wrote:
  On Saturday, May 09, 2015 11:19:16 AM Preeti U Murthy wrote:
   Hi Rafael,
   
   On 05/08/2015 07:48 PM, Rafael J. Wysocki wrote:
  
  [cut]
  
 
+  /* Take note of the planned idle state. */
+  idle_set_state(smp_processor_id(), target_state);

And I wouldn't do this either.

The behavior here is pretty much as though the driver demoted the state 
chosen
by the governor and we don't call idle_set_state() again in those cases.
   
   Why is this wrong?
  
  It is not wrong, but incomplete, because demotions done by the cpuidle 
  driver
  should also be taken into account in the same way.
  
  But I'm seeing that the recent patch of mine that made cpuidle_enter_state()
  call default_idle_call() was a mistake, because it might confuse 
  find_idlest_cpu()
  significantly as to what state the CPU is in.  I'll drop that one for now.
 
 OK, done.
 
 So after I've dropped it I think we need to do three things:
 (1) Move the idle_set_state() calls to cpuidle_enter_state().
 (2) Make cpuidle_enter_state() call default_idle_call() again, but this time
 do that *before* it has called idle_set_state() for target_state.
 (3) Introduce demotion as per my last patch.
 
 Let me cut patches for that.

Done as per the above and the patches follow in replies to this messge.

All on top of the current linux-next branch of the linux-pm.git tree.


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev