From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: Re: [PATCHv3 1/5] cpuidle: refactor out cpuidle_enter_state Date: Thu, 3 May 2012 22:50:14 +0200 Message-ID: <201205032250.14730.rjw@sisk.pl> References: <1335816551-27756-1-git-send-email-ccross@android.com> <1335816551-27756-2-git-send-email-ccross@android.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1335816551-27756-2-git-send-email-ccross@android.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-pm-bounces@lists.linux-foundation.org Errors-To: linux-pm-bounces@lists.linux-foundation.org To: Colin Cross Cc: Kevin Hilman , Len Brown , Russell King , Greg Kroah-Hartman , Kay Sievers , linux-kernel@vger.kernel.org, Amit Kucheria , linux-pm@lists.linux-foundation.org, Arjan van de Ven , Arnd Bergmann , linux-arm-kernel@lists.infradead.org List-Id: linux-pm@vger.kernel.org On Monday, April 30, 2012, Colin Cross wrote: > Split the code to enter a state and update the stats into a helper > function, cpuidle_enter_state, and export it. This function will > be called by the coupled state code to handle entering the safe > state and the final coupled state. > > Reviewed-by: Santosh Shilimkar > Tested-by: Santosh Shilimkar > Reviewed-by: Kevin Hilman > Tested-by: Kevin Hilman > Signed-off-by: Colin Cross Reviewed-by: Rafael J. Wysocki > --- > drivers/cpuidle/cpuidle.c | 42 +++++++++++++++++++++++++++++------------- > drivers/cpuidle/cpuidle.h | 2 ++ > 2 files changed, 31 insertions(+), 13 deletions(-) > > diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c > index 2f0083a..3e3e3e4 100644 > --- a/drivers/cpuidle/cpuidle.c > +++ b/drivers/cpuidle/cpuidle.c > @@ -103,6 +103,34 @@ int cpuidle_play_dead(void) > } > > /** > + * cpuidle_enter_state - enter the state and update stats > + * @dev: cpuidle device for this cpu > + * @drv: cpuidle driver for this cpu > + * @next_state: index into drv->states of the state to enter > + */ > +int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, > + int next_state) > +{ > + int entered_state; > + > + entered_state = cpuidle_enter_ops(dev, drv, next_state); > + > + if (entered_state >= 0) { > + /* Update cpuidle counters */ > + /* This can be moved to within driver enter routine > + * but that results in multiple copies of same code. > + */ > + dev->states_usage[entered_state].time += > + (unsigned long long)dev->last_residency; > + dev->states_usage[entered_state].usage++; > + } else { > + dev->last_residency = 0; > + } > + > + return entered_state; > +} > + > +/** > * cpuidle_idle_call - the main idle loop > * > * NOTE: no locks or semaphores should be used here > @@ -143,23 +171,11 @@ int cpuidle_idle_call(void) > trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu); > trace_cpu_idle_rcuidle(next_state, dev->cpu); > > - entered_state = cpuidle_enter_ops(dev, drv, next_state); > + entered_state = cpuidle_enter_state(dev, drv, next_state); > > trace_power_end_rcuidle(dev->cpu); > trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); > > - if (entered_state >= 0) { > - /* Update cpuidle counters */ > - /* This can be moved to within driver enter routine > - * but that results in multiple copies of same code. > - */ > - dev->states_usage[entered_state].time += > - (unsigned long long)dev->last_residency; > - dev->states_usage[entered_state].usage++; > - } else { > - dev->last_residency = 0; > - } > - > /* give the governor an opportunity to reflect on the outcome */ > if (cpuidle_curr_governor->reflect) > cpuidle_curr_governor->reflect(dev, entered_state); > diff --git a/drivers/cpuidle/cpuidle.h b/drivers/cpuidle/cpuidle.h > index 7db1866..d8a3ccc 100644 > --- a/drivers/cpuidle/cpuidle.h > +++ b/drivers/cpuidle/cpuidle.h > @@ -14,6 +14,8 @@ > extern struct mutex cpuidle_lock; > extern spinlock_t cpuidle_driver_lock; > extern int cpuidle_disabled(void); > +extern int cpuidle_enter_state(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int next_state); > > /* idle loop */ > extern void cpuidle_install_idle_handler(void); > From mboxrd@z Thu Jan 1 00:00:00 1970 From: rjw@sisk.pl (Rafael J. Wysocki) Date: Thu, 3 May 2012 22:50:14 +0200 Subject: [PATCHv3 1/5] cpuidle: refactor out cpuidle_enter_state In-Reply-To: <1335816551-27756-2-git-send-email-ccross@android.com> References: <1335816551-27756-1-git-send-email-ccross@android.com> <1335816551-27756-2-git-send-email-ccross@android.com> Message-ID: <201205032250.14730.rjw@sisk.pl> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Monday, April 30, 2012, Colin Cross wrote: > Split the code to enter a state and update the stats into a helper > function, cpuidle_enter_state, and export it. This function will > be called by the coupled state code to handle entering the safe > state and the final coupled state. > > Reviewed-by: Santosh Shilimkar > Tested-by: Santosh Shilimkar > Reviewed-by: Kevin Hilman > Tested-by: Kevin Hilman > Signed-off-by: Colin Cross Reviewed-by: Rafael J. Wysocki > --- > drivers/cpuidle/cpuidle.c | 42 +++++++++++++++++++++++++++++------------- > drivers/cpuidle/cpuidle.h | 2 ++ > 2 files changed, 31 insertions(+), 13 deletions(-) > > diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c > index 2f0083a..3e3e3e4 100644 > --- a/drivers/cpuidle/cpuidle.c > +++ b/drivers/cpuidle/cpuidle.c > @@ -103,6 +103,34 @@ int cpuidle_play_dead(void) > } > > /** > + * cpuidle_enter_state - enter the state and update stats > + * @dev: cpuidle device for this cpu > + * @drv: cpuidle driver for this cpu > + * @next_state: index into drv->states of the state to enter > + */ > +int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, > + int next_state) > +{ > + int entered_state; > + > + entered_state = cpuidle_enter_ops(dev, drv, next_state); > + > + if (entered_state >= 0) { > + /* Update cpuidle counters */ > + /* This can be moved to within driver enter routine > + * but that results in multiple copies of same code. > + */ > + dev->states_usage[entered_state].time += > + (unsigned long long)dev->last_residency; > + dev->states_usage[entered_state].usage++; > + } else { > + dev->last_residency = 0; > + } > + > + return entered_state; > +} > + > +/** > * cpuidle_idle_call - the main idle loop > * > * NOTE: no locks or semaphores should be used here > @@ -143,23 +171,11 @@ int cpuidle_idle_call(void) > trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu); > trace_cpu_idle_rcuidle(next_state, dev->cpu); > > - entered_state = cpuidle_enter_ops(dev, drv, next_state); > + entered_state = cpuidle_enter_state(dev, drv, next_state); > > trace_power_end_rcuidle(dev->cpu); > trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); > > - if (entered_state >= 0) { > - /* Update cpuidle counters */ > - /* This can be moved to within driver enter routine > - * but that results in multiple copies of same code. > - */ > - dev->states_usage[entered_state].time += > - (unsigned long long)dev->last_residency; > - dev->states_usage[entered_state].usage++; > - } else { > - dev->last_residency = 0; > - } > - > /* give the governor an opportunity to reflect on the outcome */ > if (cpuidle_curr_governor->reflect) > cpuidle_curr_governor->reflect(dev, entered_state); > diff --git a/drivers/cpuidle/cpuidle.h b/drivers/cpuidle/cpuidle.h > index 7db1866..d8a3ccc 100644 > --- a/drivers/cpuidle/cpuidle.h > +++ b/drivers/cpuidle/cpuidle.h > @@ -14,6 +14,8 @@ > extern struct mutex cpuidle_lock; > extern spinlock_t cpuidle_driver_lock; > extern int cpuidle_disabled(void); > +extern int cpuidle_enter_state(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int next_state); > > /* idle loop */ > extern void cpuidle_install_idle_handler(void); > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758709Ab2ECUp2 (ORCPT ); Thu, 3 May 2012 16:45:28 -0400 Received: from ogre.sisk.pl ([193.178.161.156]:52159 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755042Ab2ECUp1 (ORCPT ); Thu, 3 May 2012 16:45:27 -0400 From: "Rafael J. Wysocki" To: Colin Cross Subject: Re: [PATCHv3 1/5] cpuidle: refactor out cpuidle_enter_state Date: Thu, 3 May 2012 22:50:14 +0200 User-Agent: KMail/1.13.6 (Linux/3.4.0-rc5+; KDE/4.6.0; x86_64; ; ) Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@lists.linux-foundation.org, Kevin Hilman , Len Brown , Trinabh Gupta , Arjan van de Ven , Deepthi Dharwar , "Greg Kroah-Hartman" , Kay Sievers , Santosh Shilimkar , Daniel Lezcano , Amit Kucheria , Lorenzo Pieralisi , Arnd Bergmann , Russell King References: <1335816551-27756-1-git-send-email-ccross@android.com> <1335816551-27756-2-git-send-email-ccross@android.com> In-Reply-To: <1335816551-27756-2-git-send-email-ccross@android.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-2" Content-Transfer-Encoding: 7bit Message-Id: <201205032250.14730.rjw@sisk.pl> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Monday, April 30, 2012, Colin Cross wrote: > Split the code to enter a state and update the stats into a helper > function, cpuidle_enter_state, and export it. This function will > be called by the coupled state code to handle entering the safe > state and the final coupled state. > > Reviewed-by: Santosh Shilimkar > Tested-by: Santosh Shilimkar > Reviewed-by: Kevin Hilman > Tested-by: Kevin Hilman > Signed-off-by: Colin Cross Reviewed-by: Rafael J. Wysocki > --- > drivers/cpuidle/cpuidle.c | 42 +++++++++++++++++++++++++++++------------- > drivers/cpuidle/cpuidle.h | 2 ++ > 2 files changed, 31 insertions(+), 13 deletions(-) > > diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c > index 2f0083a..3e3e3e4 100644 > --- a/drivers/cpuidle/cpuidle.c > +++ b/drivers/cpuidle/cpuidle.c > @@ -103,6 +103,34 @@ int cpuidle_play_dead(void) > } > > /** > + * cpuidle_enter_state - enter the state and update stats > + * @dev: cpuidle device for this cpu > + * @drv: cpuidle driver for this cpu > + * @next_state: index into drv->states of the state to enter > + */ > +int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, > + int next_state) > +{ > + int entered_state; > + > + entered_state = cpuidle_enter_ops(dev, drv, next_state); > + > + if (entered_state >= 0) { > + /* Update cpuidle counters */ > + /* This can be moved to within driver enter routine > + * but that results in multiple copies of same code. > + */ > + dev->states_usage[entered_state].time += > + (unsigned long long)dev->last_residency; > + dev->states_usage[entered_state].usage++; > + } else { > + dev->last_residency = 0; > + } > + > + return entered_state; > +} > + > +/** > * cpuidle_idle_call - the main idle loop > * > * NOTE: no locks or semaphores should be used here > @@ -143,23 +171,11 @@ int cpuidle_idle_call(void) > trace_power_start_rcuidle(POWER_CSTATE, next_state, dev->cpu); > trace_cpu_idle_rcuidle(next_state, dev->cpu); > > - entered_state = cpuidle_enter_ops(dev, drv, next_state); > + entered_state = cpuidle_enter_state(dev, drv, next_state); > > trace_power_end_rcuidle(dev->cpu); > trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); > > - if (entered_state >= 0) { > - /* Update cpuidle counters */ > - /* This can be moved to within driver enter routine > - * but that results in multiple copies of same code. > - */ > - dev->states_usage[entered_state].time += > - (unsigned long long)dev->last_residency; > - dev->states_usage[entered_state].usage++; > - } else { > - dev->last_residency = 0; > - } > - > /* give the governor an opportunity to reflect on the outcome */ > if (cpuidle_curr_governor->reflect) > cpuidle_curr_governor->reflect(dev, entered_state); > diff --git a/drivers/cpuidle/cpuidle.h b/drivers/cpuidle/cpuidle.h > index 7db1866..d8a3ccc 100644 > --- a/drivers/cpuidle/cpuidle.h > +++ b/drivers/cpuidle/cpuidle.h > @@ -14,6 +14,8 @@ > extern struct mutex cpuidle_lock; > extern spinlock_t cpuidle_driver_lock; > extern int cpuidle_disabled(void); > +extern int cpuidle_enter_state(struct cpuidle_device *dev, > + struct cpuidle_driver *drv, int next_state); > > /* idle loop */ > extern void cpuidle_install_idle_handler(void); >