mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Julius Werner <jwerner@chromium.org>
Cc: linux-kernel@vger.kernel.org, len.brown@intel.com,
	khilman@ti.com, rjw@sisk.pl, deepthi@linux.vnet.ibm.com,
	akpm@linux-foundation.org, g.trinabh@gmail.com,
	snanda@chromium.org,
	Lists Linaro-dev <linaro-dev@lists.linaro.org>
Subject: Re: [PATCH] cpuidle: reinitialize power_usage values when adding/removing C-states
Date: Wed, 17 Oct 2012 12:31:15 +0200	[thread overview]
Message-ID: <507E88F3.8070403@linaro.org> (raw)
In-Reply-To: <1350427184-11684-1-git-send-email-jwerner@chromium.org>

On 10/17/2012 12:39 AM, Julius Werner wrote:
> When cpuidle drivers do not supply explicit power_usage values,
> cpuidle/driver.c inserts dummy values instead. When a running processor
> dynamically gains new C-states (e.g. after ACPI events), the power_usage
> values of those states will stay uninitialized, and cpuidle governors
> will never choose to enter them.
> 
> This patch moves the dummy value initialization from
> cpuidle_register_driver to cpuidle_enable_device, which drivers such as
> acpi/processor_idle.c will call again when they add or remove C-states.
> Tested and verified on an Acer AC700 Chromebook, which supports the C3
> state only when it switches from AC to battery power.
> 
> Signed-off-by: Julius Werner <jwerner@chromium.org>
> ---

This is specific to the acpi and should be handled in the
processor_idle.c file instead of the cpuidle core code.

Could be the function 'acpi_processor_cst_has_changed' the right place
to set a dummy power value for the power in the new C-state ?




>  drivers/cpuidle/cpuidle.c |   24 ++++++++++++++++++++++++
>  drivers/cpuidle/driver.c  |   25 -------------------------
>  2 files changed, 24 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
> index 7f15b85..bef3a31 100644
> --- a/drivers/cpuidle/cpuidle.c
> +++ b/drivers/cpuidle/cpuidle.c
> @@ -298,6 +298,28 @@ static void poll_idle_init(struct cpuidle_driver *drv)
>  static void poll_idle_init(struct cpuidle_driver *drv) {}
>  #endif /* CONFIG_ARCH_HAS_CPU_RELAX */
>  
> +static void set_power_states(struct cpuidle_driver *drv)
> +{
> +	int i;
> +
> +	/*
> +	 * cpuidle driver should set the drv->power_specified bit
> +	 * before registering if the driver provides
> +	 * power_usage numbers.
> +	 *
> +	 * If power_specified is not set,
> +	 * we fill in power_usage with decreasing values as the
> +	 * cpuidle code has an implicit assumption that state Cn
> +	 * uses less power than C(n-1).
> +	 *
> +	 * With CONFIG_ARCH_HAS_CPU_RELAX, C0 is already assigned
> +	 * an power value of -1.  So we use -2, -3, etc, for other
> +	 * c-states.
> +	 */
> +	for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++)
> +		drv->states[i].power_usage = -1 - i;
> +}
> +
>  /**
>   * cpuidle_enable_device - enables idle PM for a CPU
>   * @dev: the CPU
> @@ -330,6 +352,8 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
>  		cpuidle_enter_tk : cpuidle_enter;
>  
>  	poll_idle_init(drv);
> +	if (!drv->power_specified)
> +		set_power_states(drv);
>  
>  	if ((ret = cpuidle_add_state_sysfs(dev)))
>  		return ret;
> diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c
> index 87db387..caaed27 100644
> --- a/drivers/cpuidle/driver.c
> +++ b/drivers/cpuidle/driver.c
> @@ -18,28 +18,6 @@ static struct cpuidle_driver *cpuidle_curr_driver;
>  DEFINE_SPINLOCK(cpuidle_driver_lock);
>  int cpuidle_driver_refcount;
>  
> -static void set_power_states(struct cpuidle_driver *drv)
> -{
> -	int i;
> -
> -	/*
> -	 * cpuidle driver should set the drv->power_specified bit
> -	 * before registering if the driver provides
> -	 * power_usage numbers.
> -	 *
> -	 * If power_specified is not set,
> -	 * we fill in power_usage with decreasing values as the
> -	 * cpuidle code has an implicit assumption that state Cn
> -	 * uses less power than C(n-1).
> -	 *
> -	 * With CONFIG_ARCH_HAS_CPU_RELAX, C0 is already assigned
> -	 * an power value of -1.  So we use -2, -3, etc, for other
> -	 * c-states.
> -	 */
> -	for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++)
> -		drv->states[i].power_usage = -1 - i;
> -}
> -
>  /**
>   * cpuidle_register_driver - registers a driver
>   * @drv: the driver
> @@ -58,9 +36,6 @@ int cpuidle_register_driver(struct cpuidle_driver *drv)
>  		return -EBUSY;
>  	}
>  
> -	if (!drv->power_specified)
> -		set_power_states(drv);
> -
>  	cpuidle_curr_driver = drv;
>  
>  	spin_unlock(&cpuidle_driver_lock);


-- 
 <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:[~2012-10-17 10:31 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-16 22:39 Julius Werner
2012-10-17 10:31 ` Daniel Lezcano [this message]
2012-10-17 10:44   ` Daniel Lezcano
2012-10-17 18:43   ` Julius Werner
2012-10-18  8:21     ` Daniel Lezcano
2012-10-19 21:50       ` [PATCH] acpi/cpuidle: " Julius Werner
2012-10-20 21:50         ` Daniel Lezcano
2012-10-22 17:13           ` Julius Werner
2012-10-22 17:21             ` Daniel Lezcano
2012-11-12 20:26           ` [RFC] cpuidle - remove the power_specified field in the driver Daniel Lezcano
2012-11-12 21:09             ` Julius Werner
2012-11-12 22:08               ` Daniel Lezcano
2012-11-18  8:40             ` Francesco Lavra
2012-11-18  9:17               ` Daniel Lezcano
2012-12-10 19:09                 ` Julius Werner
2012-12-10 22:41                   ` Rafael J. Wysocki
2012-12-11  9:46                   ` Daniel Lezcano

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=507E88F3.8070403@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=akpm@linux-foundation.org \
    --cc=deepthi@linux.vnet.ibm.com \
    --cc=g.trinabh@gmail.com \
    --cc=jwerner@chromium.org \
    --cc=khilman@ti.com \
    --cc=len.brown@intel.com \
    --cc=linaro-dev@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rjw@sisk.pl \
    --cc=snanda@chromium.org \
    /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

Powered by JetHome