linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Preeti U Murthy <preeti@linux.vnet.ibm.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Linux PM list <linux-pm@vger.kernel.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Len Brown <len.brown@intel.com>
Subject: Re: [PATCH] cpuidle: Do not use CPUIDLE_DRIVER_STATE_START in cpuidle.c
Date: Wed, 27 May 2015 14:25:59 +0200	[thread overview]
Message-ID: <5565B7D7.3000308@linaro.org> (raw)
In-Reply-To: <5565AB09.8090802@linux.vnet.ibm.com>

On 05/27/2015 01:31 PM, Preeti U Murthy wrote:
> On 05/27/2015 07:06 AM, Rafael J. Wysocki wrote:
>> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>>
>> The CPUIDLE_DRIVER_STATE_START symbol is defined as 1 only if
>> CONFIG_ARCH_HAS_CPU_RELAX is set, otherwise it is defined as 0.
>> However, if CONFIG_ARCH_HAS_CPU_RELAX is set, the first (index 0)
>> entry in the cpuidle driver's table of states is overwritten with
>> the default "poll" entry by the core.  The "state" defined by the
>> "poll" entry doesn't provide ->enter_dead and ->enter_freeze
>> callbacks and its exit_latency is 0.
>>
>> For this reason, it is not necessary to use CPUIDLE_DRIVER_STATE_START
>> in cpuidle_play_dead() (->enter_dead is NULL, so the "poll state"
>> will be skipped by the loop) and in find_deepest_state() (since
>> exit_latency is 0, the "poll state" will become the default if the
>> "s->exit_latency <= latency_req" check is replaced with
>> "s->exit_latency < latency_req" which may only matter for drivers
>> providing different states with the same exit_latency).
>>
>> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>> ---
>>   drivers/cpuidle/cpuidle.c |    8 ++++----
>>   1 file changed, 4 insertions(+), 4 deletions(-)
> <snip>
>
>>
>> @@ -79,13 +79,13 @@ static int find_deepest_state(struct cpu
>>   			      bool freeze)
>>   {
>>   	unsigned int latency_req = 0;
>> -	int i, ret = freeze ? -1 : CPUIDLE_DRIVER_STATE_START - 1;
>> +	int i, ret = -ENXIO;
>>
>> -	for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) {
>> +	for (i = 0; i < drv->state_count; i++) {
>>   		struct cpuidle_state *s = &drv->states[i];
>>   		struct cpuidle_state_usage *su = &dev->states_usage[i];
>>
>> -		if (s->disabled || su->disable || s->exit_latency <= latency_req
>> +		if (s->disabled || su->disable || s->exit_latency < latency_req
>
> Prior to this patch,
>
> For drivers on which CPUIDLE_DRIVER_STATE_START takes a value 0 and
> whose first idle state has an exit_latency of 0, find_deepest_state()
> would return -1 if it failed to find a deeper idle state.
> But as an effect of this patch, find_deepest_state() returns 0 in the
> above circumstance.

Except I am missing something, with an exit_latency = 0, the state will 
be never selected, because of the "s->exit_latency < latency_req" 
condition (strictly greater than).

> My concern is if these drivers do not intend to enter a polling state
> during suspend, this will cause an issue, won't it? This also gets me
> wondering if polling state is an acceptable idle state during suspend,
> given that the drivers with ARCH_HAS_CPU_RELAX permit entry into it
> during suspend today.

Definitively poll can cause thermal issues, especially when suspending. 
It is a dangerous state (let's imagine you close your laptop => 
suspend/poll and then put it in your bag for a travel).

I don't think with the code above we can reach this situation but I 
agree this is something we have to take care carefully.

Actually, I am in favour of removing poll at all from the cpuidle driver 
and poll only when a cpuidle state selection fails under certain condition.

So I fully agree with your statement below.

> I would expect the cpus to be in a hardware
> defined idle state.




-- 
  <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


  reply	other threads:[~2015-05-27 12:26 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-27  1:36 [PATCH] cpuidle: Do not use CPUIDLE_DRIVER_STATE_START in cpuidle.c Rafael J. Wysocki
2015-05-27  8:22 ` Daniel Lezcano
2015-05-27 11:31 ` Preeti U Murthy
2015-05-27 12:25   ` Daniel Lezcano [this message]
2015-05-27 13:57     ` Rafael J. Wysocki
2015-05-27 16:19       ` Preeti U Murthy
2015-05-28  0:51         ` Rafael J. Wysocki
2015-05-28  2:09 ` [PATCH v2] " Rafael J. Wysocki
2015-05-28  1:58   ` Preeti U Murthy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5565B7D7.3000308@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=preeti@linux.vnet.ibm.com \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).