From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751800AbbEDPET (ORCPT ); Mon, 4 May 2015 11:04:19 -0400 Received: from mail-wi0-f172.google.com ([209.85.212.172]:36673 "EHLO mail-wi0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751316AbbEDPEM (ORCPT ); Mon, 4 May 2015 11:04:12 -0400 Message-ID: <55478A68.8060902@linaro.org> Date: Mon, 04 May 2015 17:04:08 +0200 From: Daniel Lezcano User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: "Rafael J. Wysocki" , Peter Zijlstra CC: Linux PM list , Linux Kernel Mailing List Subject: Re: [PATCH 4/4] sched / idle: Call default_idle_call() from cpuidle_enter_state() References: <3084951.QaIkFrZ3VU@vostro.rjw.lan> <3809765.j45t3RE71A@vostro.rjw.lan> In-Reply-To: <3809765.j45t3RE71A@vostro.rjw.lan> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/04/2015 03:58 PM, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki > > The check of the cpuidle_enter() return value against -EBUSY > made in call_cpuidle() will not be necessary any more if > cpuidle_enter_state() calls default_idle_call() directly when it > is about to return -EBUSY, so make that happen and eliminate the > check. > > Signed-off-by: Rafael J. Wysocki > > --- > drivers/cpuidle/cpuidle.c | 4 +++- > drivers/cpuidle/cpuidle.h | 2 ++ > kernel/sched/idle.c | 14 ++++++-------- > 3 files changed, 11 insertions(+), 9 deletions(-) > > Index: linux-pm/drivers/cpuidle/cpuidle.c > =================================================================== > --- linux-pm.orig/drivers/cpuidle/cpuidle.c > +++ linux-pm/drivers/cpuidle/cpuidle.c > @@ -167,8 +167,10 @@ int cpuidle_enter_state(struct cpuidle_d > * local timer will be shut down. If a local timer is used from another > * CPU as a broadcast timer, this call may fail if it is not available. > */ > - if (broadcast && tick_broadcast_enter()) > + if (broadcast && tick_broadcast_enter()) { > + default_idle_call(); > return -EBUSY; > + } > > trace_cpu_idle_rcuidle(index, dev->cpu); > time_start = ktime_get(); > Index: linux-pm/drivers/cpuidle/cpuidle.h > =================================================================== > --- linux-pm.orig/drivers/cpuidle/cpuidle.h > +++ linux-pm/drivers/cpuidle/cpuidle.h > @@ -18,6 +18,8 @@ extern int cpuidle_enter_state(struct cp > /* idle loop */ > extern void cpuidle_install_idle_handler(void); > extern void cpuidle_uninstall_idle_handler(void); > +/* kernel/sched/idle.c */ > +extern void default_idle_call(void); There is a cyclic dependency introduced with this function. idle.c <=> cpuidle.c Are we sure we want them to be mutually dependent ? > /* governors */ > extern int cpuidle_switch_governor(struct cpuidle_governor *gov); > Index: linux-pm/kernel/sched/idle.c > =================================================================== > --- linux-pm.orig/kernel/sched/idle.c > +++ linux-pm/kernel/sched/idle.c > @@ -67,11 +67,12 @@ void __weak arch_cpu_idle(void) > local_irq_enable(); > } > > -static void default_idle_call(void) { > - /* > - * We can't use the cpuidle framework, let's use the default idle > - * routine. > - */ > +/** > + * default_idle_call - Default CPU idle routine. > + * > + * To use when the cpuidle framework cannot be used. > + */ > +void default_idle_call(void) { Same comment as Peter on the patch 1/4. > if (current_clr_polling_and_test()) > local_irq_enable(); > else > @@ -112,9 +113,6 @@ static int call_cpuidle(struct cpuidle_d > /* The cpu is no longer idle or about to enter idle. */ > idle_set_state(this_rq(), NULL); > > - if (entered_state == -EBUSY) > - default_idle_call(); > - > return entered_state; > } > > -- Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog