All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Colin Cross <ccross@android.com>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-pm@lists.linux-foundation.org,
	Len Brown <len.brown@intel.com>, Kevin Hilman <khilman@ti.com>,
	Santosh Shilimkar <santosh.shilimkar@ti.com>,
	Amit Kucheria <amit.kucheria@linaro.org>,
	Arjan van de Ven <arjan@linux.intel.com>,
	Trinabh Gupta <g.trinabh@gmail.com>,
	Deepthi Dharwar <deepthi@linux.vnet.ibm.com>,
	linux-omap@vger.kernel.org, linux-tegra@vger.kernel.org
Subject: Re: [PATCH 0/3] coupled cpuidle state support
Date: Fri, 20 Jan 2012 09:46:33 +0100	[thread overview]
Message-ID: <4F1929E9.7070707@linaro.org> (raw)
In-Reply-To: <1324426147-16735-1-git-send-email-ccross@android.com>

On 12/21/2011 01:09 AM, Colin Cross wrote:
> On some ARM SMP SoCs (OMAP4460, Tegra 2, and probably more), the
> cpus cannot be independently powered down, either due to
> sequencing restrictions (on Tegra 2, cpu 0 must be the last to
> power down), or due to HW bugs (on OMAP4460, a cpu powering up
> will corrupt the gic state unless the other cpu runs a work
> around).  Each cpu has a power state that it can enter without
> coordinating with the other cpu (usually Wait For Interrupt, or
> WFI), and one or more "coupled" power states that affect blocks
> shared between the cpus (L2 cache, interrupt controller, and
> sometimes the whole SoC).  Entering a coupled power state must
> be tightly controlled on both cpus.
>
> The easiest solution to implementing coupled cpu power states is
> to hotplug all but one cpu whenever possible, usually using a
> cpufreq governor that looks at cpu load to determine when to
> enable the secondary cpus.  This causes problems, as hotplug is an
> expensive operation, so the number of hotplug transitions must be
> minimized, leading to very slow response to loads, often on the
> order of seconds.
>
> This patch series implements an alternative solution, where each
> cpu will wait in the WFI state until all cpus are ready to enter
> a coupled state, at which point the coupled state function will
> be called on all cpus at approximately the same time.
>
> Once all cpus are ready to enter idle, they are woken by an smp
> cross call.  At this point, there is a chance that one of the
> cpus will find work to do, and choose not to enter suspend.  A
> final pass is needed to guarantee that all cpus will call the
> power state enter function at the same time.  During this pass,
> each cpu will increment the ready counter, and continue once the
> ready counter matches the number of online coupled cpus.  If any
> cpu exits idle, the other cpus will decrement their counter and
> retry.
>
> To use coupled cpuidle states, a cpuidle driver must:
>
>     Set struct cpuidle_device.coupled_cpus to the mask of all
>     coupled cpus, usually the same as cpu_possible_mask if all cpus
>     are part of the same cluster.  The coupled_cpus mask must be
>     set in the struct cpuidle_device for each cpu.
>
>     Set struct cpuidle_device.safe_state to a state that is not a
>     coupled state.  This is usually WFI.
>
>     Set CPUIDLE_FLAG_COUPLED in struct cpuidle_state.flags for each
>     state that affects multiple cpus.
>
>     Provide a struct cpuidle_state.enter function for each state
>     that affects multiple cpus.  This function is guaranteed to be
>     called on all cpus at approximately the same time.  The driver
>     should ensure that the cpus all abort together if any cpu tries
>     to abort once the function is called.
>
> This series was functionally tested on v3.0, but has only been
> compile-tested on v3.2 after the removal of per-cpu state fields.

Hi Colin,

this patchset could be interesting to resolve in a generic way the cpu 
dependencies.
What is the status of this patchset ?

Did you have the opportunity to measure the power consumption with and 
without this patchset ?

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


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: daniel.lezcano@linaro.org (Daniel Lezcano)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 0/3] coupled cpuidle state support
Date: Fri, 20 Jan 2012 09:46:33 +0100	[thread overview]
Message-ID: <4F1929E9.7070707@linaro.org> (raw)
In-Reply-To: <1324426147-16735-1-git-send-email-ccross@android.com>

On 12/21/2011 01:09 AM, Colin Cross wrote:
> On some ARM SMP SoCs (OMAP4460, Tegra 2, and probably more), the
> cpus cannot be independently powered down, either due to
> sequencing restrictions (on Tegra 2, cpu 0 must be the last to
> power down), or due to HW bugs (on OMAP4460, a cpu powering up
> will corrupt the gic state unless the other cpu runs a work
> around).  Each cpu has a power state that it can enter without
> coordinating with the other cpu (usually Wait For Interrupt, or
> WFI), and one or more "coupled" power states that affect blocks
> shared between the cpus (L2 cache, interrupt controller, and
> sometimes the whole SoC).  Entering a coupled power state must
> be tightly controlled on both cpus.
>
> The easiest solution to implementing coupled cpu power states is
> to hotplug all but one cpu whenever possible, usually using a
> cpufreq governor that looks at cpu load to determine when to
> enable the secondary cpus.  This causes problems, as hotplug is an
> expensive operation, so the number of hotplug transitions must be
> minimized, leading to very slow response to loads, often on the
> order of seconds.
>
> This patch series implements an alternative solution, where each
> cpu will wait in the WFI state until all cpus are ready to enter
> a coupled state, at which point the coupled state function will
> be called on all cpus at approximately the same time.
>
> Once all cpus are ready to enter idle, they are woken by an smp
> cross call.  At this point, there is a chance that one of the
> cpus will find work to do, and choose not to enter suspend.  A
> final pass is needed to guarantee that all cpus will call the
> power state enter function at the same time.  During this pass,
> each cpu will increment the ready counter, and continue once the
> ready counter matches the number of online coupled cpus.  If any
> cpu exits idle, the other cpus will decrement their counter and
> retry.
>
> To use coupled cpuidle states, a cpuidle driver must:
>
>     Set struct cpuidle_device.coupled_cpus to the mask of all
>     coupled cpus, usually the same as cpu_possible_mask if all cpus
>     are part of the same cluster.  The coupled_cpus mask must be
>     set in the struct cpuidle_device for each cpu.
>
>     Set struct cpuidle_device.safe_state to a state that is not a
>     coupled state.  This is usually WFI.
>
>     Set CPUIDLE_FLAG_COUPLED in struct cpuidle_state.flags for each
>     state that affects multiple cpus.
>
>     Provide a struct cpuidle_state.enter function for each state
>     that affects multiple cpus.  This function is guaranteed to be
>     called on all cpus at approximately the same time.  The driver
>     should ensure that the cpus all abort together if any cpu tries
>     to abort once the function is called.
>
> This series was functionally tested on v3.0, but has only been
> compile-tested on v3.2 after the removal of per-cpu state fields.

Hi Colin,

this patchset could be interesting to resolve in a generic way the cpu 
dependencies.
What is the status of this patchset ?

Did you have the opportunity to measure the power consumption with and 
without this patchset ?

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

WARNING: multiple messages have this Message-ID (diff)
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Colin Cross <ccross@android.com>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-pm@lists.linux-foundation.org,
	Len Brown <len.brown@intel.com>, Kevin Hilman <khilman@ti.com>,
	Santosh Shilimkar <santosh.shilimkar@ti.com>,
	Amit Kucheria <amit.kucheria@linaro.org>,
	Arjan van de Ven <arjan@linux.intel.com>,
	Trinabh Gupta <g.trinabh@gmail.com>,
	Deepthi Dharwar <deepthi@linux.vnet.ibm.com>,
	linux-omap@vger.kernel.org, linux-tegra@vger.kernel.org
Subject: Re: [PATCH 0/3] coupled cpuidle state support
Date: Fri, 20 Jan 2012 09:46:33 +0100	[thread overview]
Message-ID: <4F1929E9.7070707@linaro.org> (raw)
In-Reply-To: <1324426147-16735-1-git-send-email-ccross@android.com>

On 12/21/2011 01:09 AM, Colin Cross wrote:
> On some ARM SMP SoCs (OMAP4460, Tegra 2, and probably more), the
> cpus cannot be independently powered down, either due to
> sequencing restrictions (on Tegra 2, cpu 0 must be the last to
> power down), or due to HW bugs (on OMAP4460, a cpu powering up
> will corrupt the gic state unless the other cpu runs a work
> around).  Each cpu has a power state that it can enter without
> coordinating with the other cpu (usually Wait For Interrupt, or
> WFI), and one or more "coupled" power states that affect blocks
> shared between the cpus (L2 cache, interrupt controller, and
> sometimes the whole SoC).  Entering a coupled power state must
> be tightly controlled on both cpus.
>
> The easiest solution to implementing coupled cpu power states is
> to hotplug all but one cpu whenever possible, usually using a
> cpufreq governor that looks at cpu load to determine when to
> enable the secondary cpus.  This causes problems, as hotplug is an
> expensive operation, so the number of hotplug transitions must be
> minimized, leading to very slow response to loads, often on the
> order of seconds.
>
> This patch series implements an alternative solution, where each
> cpu will wait in the WFI state until all cpus are ready to enter
> a coupled state, at which point the coupled state function will
> be called on all cpus at approximately the same time.
>
> Once all cpus are ready to enter idle, they are woken by an smp
> cross call.  At this point, there is a chance that one of the
> cpus will find work to do, and choose not to enter suspend.  A
> final pass is needed to guarantee that all cpus will call the
> power state enter function at the same time.  During this pass,
> each cpu will increment the ready counter, and continue once the
> ready counter matches the number of online coupled cpus.  If any
> cpu exits idle, the other cpus will decrement their counter and
> retry.
>
> To use coupled cpuidle states, a cpuidle driver must:
>
>     Set struct cpuidle_device.coupled_cpus to the mask of all
>     coupled cpus, usually the same as cpu_possible_mask if all cpus
>     are part of the same cluster.  The coupled_cpus mask must be
>     set in the struct cpuidle_device for each cpu.
>
>     Set struct cpuidle_device.safe_state to a state that is not a
>     coupled state.  This is usually WFI.
>
>     Set CPUIDLE_FLAG_COUPLED in struct cpuidle_state.flags for each
>     state that affects multiple cpus.
>
>     Provide a struct cpuidle_state.enter function for each state
>     that affects multiple cpus.  This function is guaranteed to be
>     called on all cpus at approximately the same time.  The driver
>     should ensure that the cpus all abort together if any cpu tries
>     to abort once the function is called.
>
> This series was functionally tested on v3.0, but has only been
> compile-tested on v3.2 after the removal of per-cpu state fields.

Hi Colin,

this patchset could be interesting to resolve in a generic way the cpu 
dependencies.
What is the status of this patchset ?

Did you have the opportunity to measure the power consumption with and 
without this patchset ?

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



  parent reply	other threads:[~2012-01-20  8:46 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-21  0:09 [PATCH 0/3] coupled cpuidle state support Colin Cross
2011-12-21  0:09 ` Colin Cross
2011-12-21  0:09 ` Colin Cross
2011-12-21  0:09 ` [PATCH 1/3] cpuidle: refactor out cpuidle_enter_state Colin Cross
2011-12-21  0:09   ` Colin Cross
2011-12-21  0:09   ` Colin Cross
2012-01-04 14:08   ` Jean Pihet
2012-01-04 14:08     ` [linux-pm] " Jean Pihet
2012-01-04 14:08     ` Jean Pihet
     [not found] ` <1324426147-16735-1-git-send-email-ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>
2011-12-21  0:09   ` [PATCH 2/3] cpuidle: fix error handling in __cpuidle_register_device Colin Cross
2011-12-21  0:09     ` Colin Cross
2011-12-21  0:09     ` Colin Cross
2011-12-21  0:09 ` Colin Cross
2011-12-21  0:09 ` [PATCH 3/3] cpuidle: add support for states that affect multiple cpus Colin Cross
2011-12-21  0:09 ` Colin Cross
2011-12-21  0:09   ` Colin Cross
2011-12-21  9:02 ` [PATCH 0/3] coupled cpuidle state support Arjan van de Ven
2011-12-21  9:02 ` Arjan van de Ven
2011-12-21  9:02   ` Arjan van de Ven
2011-12-21  9:40   ` Colin Cross
     [not found]   ` <4EF1A0B4.5080307-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2011-12-21  9:40     ` Colin Cross
2011-12-21  9:40       ` Colin Cross
2011-12-21  9:40       ` Colin Cross
2011-12-21  9:44       ` Arjan van de Ven
2011-12-21  9:44         ` Arjan van de Ven
2011-12-21  9:44         ` Arjan van de Ven
2011-12-21  9:55         ` Colin Cross
     [not found]         ` <4EF1AA8A.8060304-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2011-12-21  9:55           ` Colin Cross
2011-12-21  9:55             ` Colin Cross
2011-12-21  9:55             ` Colin Cross
2011-12-21 12:12             ` Arjan van de Ven
2011-12-21 12:12               ` Arjan van de Ven
2011-12-21 19:05               ` Colin Cross
2011-12-21 19:05                 ` Colin Cross
2011-12-21 19:05                 ` Colin Cross
2011-12-21 19:36                 ` Arjan van de Ven
     [not found]                 ` <CAMbhsRRnKoR3YPWrZzVynVe+dcuU5v0siYvmp2vbBcS1hquC7Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-21 19:36                   ` Arjan van de Ven
2011-12-21 19:36                     ` Arjan van de Ven
2011-12-21 19:36                     ` Arjan van de Ven
2011-12-21 19:42                     ` Colin Cross
2011-12-21 19:42                       ` [linux-pm] " Colin Cross
2011-12-21 19:42                       ` Colin Cross
2011-12-22  8:35                       ` Shilimkar, Santosh
     [not found]                       ` <CAMbhsRSPCo9MSGp57Fv0sRdYUFcdwx8jEz1-CfX8LdKf8X4MVg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-22  8:35                         ` [linux-pm] " Shilimkar, Santosh
2011-12-22  8:35                           ` Shilimkar, Santosh
2011-12-22  8:35                           ` Shilimkar, Santosh
2011-12-22  8:53                           ` Arjan van de Ven
2011-12-22  8:53                             ` [linux-pm] " Arjan van de Ven
2011-12-22  8:53                             ` Arjan van de Ven
2011-12-22  9:30                             ` Shilimkar, Santosh
2011-12-22  9:30                               ` Shilimkar, Santosh
2011-12-22  9:30                             ` Shilimkar, Santosh
2011-12-22 21:20                             ` Colin Cross
     [not found]                             ` <4EF2F01E.8060307-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2011-12-22 21:20                               ` [linux-pm] " Colin Cross
2011-12-22 21:20                                 ` Colin Cross
2011-12-22 21:20                                 ` Colin Cross
     [not found]               ` <4EF1CD49.9020800-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2012-03-14  0:39                 ` Colin Cross
2012-03-14  0:39                   ` Colin Cross
2012-03-14  0:39                   ` Colin Cross
2011-12-21 12:12             ` Arjan van de Ven
2012-01-04  0:41 ` Kevin Hilman
2012-01-04  0:41   ` Kevin Hilman
2012-01-04  0:41   ` Kevin Hilman
2012-01-04 17:27   ` Shilimkar, Santosh
2012-01-04 17:27     ` Shilimkar, Santosh
2012-01-04 17:27   ` Shilimkar, Santosh
2012-01-20  8:46 ` Daniel Lezcano [this message]
2012-01-20  8:46   ` Daniel Lezcano
2012-01-20  8:46   ` Daniel Lezcano
2012-01-20 20:40   ` Colin Cross
2012-01-20 20:40     ` Colin Cross
2012-01-20 20:40     ` Colin Cross
2012-01-25 14:04     ` Daniel Lezcano
2012-01-25 14:04       ` Daniel Lezcano
2012-01-31 14:13       ` Daniel Lezcano
2012-01-31 14:13         ` Daniel Lezcano
     [not found]     ` <CAMbhsRTbVqV6p0py9NGZrpFPf2yvp-B0dr+o-m7qbdja_-Lfzw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-01-27  8:54       ` [linux-pm] " Vincent Guittot
2012-01-27  8:54         ` Vincent Guittot
2012-01-27  8:54         ` Vincent Guittot
2012-01-27 17:32         ` Colin Cross
2012-01-27 17:32           ` Colin Cross
2012-01-27 17:32           ` Colin Cross
     [not found]           ` <CAMbhsRQYVXTZ2pX4mBrM6=SyGTqn_GY8xsW4rt_e21zerEzctA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-02-01 12:13             ` Vincent Guittot
2012-02-01 12:13               ` Vincent Guittot
2012-02-01 12:13               ` Vincent Guittot
2012-02-01 14:59               ` Lorenzo Pieralisi
2012-02-01 14:59                 ` [linux-pm] " Lorenzo Pieralisi
2012-02-01 14:59                 ` Lorenzo Pieralisi
2012-02-01 17:30                 ` Colin Cross
2012-02-01 17:30                   ` Colin Cross
2012-02-01 17:30                   ` Colin Cross
2012-02-01 18:07                   ` Lorenzo Pieralisi
2012-02-01 18:07                     ` [linux-pm] " Lorenzo Pieralisi
2012-02-01 18:07                     ` Lorenzo Pieralisi
2012-02-03  1:19                     ` Colin Cross
2012-02-03  1:19                       ` [linux-pm] " Colin Cross
2012-02-03  1:19                       ` Colin Cross
2012-03-13 23:52   ` Kevin Hilman
2012-03-13 23:52     ` Kevin Hilman
     [not found]     ` <8762e8kqi6.fsf-l0cyMroinI0@public.gmane.org>
2012-03-14  0:28       ` Colin Cross
2012-03-14  0:28         ` Colin Cross
2012-03-14  0:28         ` Colin Cross
2012-03-14  0:47         ` Colin Cross
2012-03-14  0:47           ` Colin Cross
2012-03-14  0:47           ` Colin Cross
     [not found]           ` <CAMbhsRRD2bdkcUZvScb-cF05e=R3h69bNVaTPFX4jBKBBOjuMg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-03-14 14:23             ` [linux-pm] " Kevin Hilman
2012-03-14 14:23               ` Kevin Hilman
2012-03-14 14:23               ` Kevin Hilman
2012-03-14  2:04     ` Arjan van de Ven
2012-03-14  2:04       ` Arjan van de Ven
2012-03-14  2:04       ` Arjan van de Ven
2012-03-14  2:21       ` Colin Cross
2012-03-14  2:21         ` Colin Cross
2012-03-14  2:21         ` Colin Cross
  -- strict thread matches above, loose matches on Subject: below --
2011-12-21  0:09 Colin Cross

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=4F1929E9.7070707@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=amit.kucheria@linaro.org \
    --cc=arjan@linux.intel.com \
    --cc=ccross@android.com \
    --cc=deepthi@linux.vnet.ibm.com \
    --cc=g.trinabh@gmail.com \
    --cc=khilman@ti.com \
    --cc=len.brown@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=santosh.shilimkar@ti.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.