, Arnd Bergmann <a...@arndb.de>, ulli.kr...@googlemail.com, vgu...@kernel.org, 
linux-...@vger.kernel.org, j...@joshtriplett.org, rost...@goodmis.org, 
r...@vger.kernel.org, b...@alien8.de, bc...@quicinc.com, 
tsbog...@alpha.franken.de, linux-par...@vger.kernel.org, sudeep.ho...@arm.com, 
shawn...@kernel.org, da...@davemloft.net, dal...@libc.org, t...@atomide.com, 
amakha...@vmware.com, bjorn.anders...@linaro.org, h...@zytor.com, 
sparcli...@vger.kernel.org, linux-hexa...@vger.kernel.org, 
linux-ri...@lists.infradead.org, anton.iva...@cambridgegreys.com, 
jo...@southpole.se, yury.no...@gmail.com, rich...@nod.at, x...@kernel.org, 
li...@armlinux.org.uk, mi...@redhat.com, a...@eecs.berkeley.edu, 
paul...@kernel.org, h...@linux.ibm.com, stefan.kristians...@saunalahti.fi, 
openr...@lists.librecores.org, paul.walms...@sifive.com, 
linux-te...@vger.kernel.org, namhy...@kernel.org, 
andriy.shevche...@linux.intel.com, jpoim...@kernel.org, jgr...@suse.com, 
mon...@monstr.eu, linux-m...@vger.kernel.org, palmer@dab
 belt.com, a...@brainfault.org, i...@jurassic.park.msu.ru, 
johan...@sipsolutions.net, linuxppc-dev@lists.ozlabs.org
Errors-To: linuxppc-dev-bounces+archive=mail-archive....@lists.ozlabs.org
Sender: "Linuxppc-dev" 
<linuxppc-dev-bounces+archive=mail-archive....@lists.ozlabs.org>

Doing RCU-idle outside the driver, only to then temporarily enable it
again, at least twice, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 drivers/cpuidle/cpuidle-tegra.c |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

--- a/drivers/cpuidle/cpuidle-tegra.c
+++ b/drivers/cpuidle/cpuidle-tegra.c
@@ -180,9 +180,11 @@ static int tegra_cpuidle_state_enter(str
        }
 
        local_fiq_disable();
-       RCU_NONIDLE(tegra_pm_set_cpu_in_lp2());
+       tegra_pm_set_cpu_in_lp2();
        cpu_pm_enter();
 
+       rcu_idle_enter();
+
        switch (index) {
        case TEGRA_C7:
                err = tegra_cpuidle_c7_enter();
@@ -197,8 +199,10 @@ static int tegra_cpuidle_state_enter(str
                break;
        }
 
+       rcu_idle_exit();
+
        cpu_pm_exit();
-       RCU_NONIDLE(tegra_pm_clear_cpu_in_lp2());
+       tegra_pm_clear_cpu_in_lp2();
        local_fiq_enable();
 
        return err ?: index;
@@ -226,6 +230,7 @@ static int tegra_cpuidle_enter(struct cp
                               struct cpuidle_driver *drv,
                               int index)
 {
+       bool do_rcu = drv->states[index].flags & CPUIDLE_FLAG_RCU_IDLE;
        unsigned int cpu = cpu_logical_map(dev->cpu);
        int ret;
 
@@ -233,9 +238,13 @@ static int tegra_cpuidle_enter(struct cp
        if (dev->states_usage[index].disable)
                return -1;
 
-       if (index == TEGRA_C1)
+       if (index == TEGRA_C1) {
+               if (do_rcu)
+                       rcu_idle_enter();
                ret = arm_cpuidle_simple_enter(dev, drv, index);
-       else
+               if (do_rcu)
+                       rcu_idle_exit();
+       } else
                ret = tegra_cpuidle_state_enter(dev, index, cpu);
 
        if (ret < 0) {
@@ -285,7 +294,8 @@ static struct cpuidle_driver tegra_idle_
                        .exit_latency           = 2000,
                        .target_residency       = 2200,
                        .power_usage            = 100,
-                       .flags                  = CPUIDLE_FLAG_TIMER_STOP,
+                       .flags                  = CPUIDLE_FLAG_TIMER_STOP |
+                                                 CPUIDLE_FLAG_RCU_IDLE,
                        .name                   = "C7",
                        .desc                   = "CPU core powered off",
                },
@@ -295,6 +305,7 @@ static struct cpuidle_driver tegra_idle_
                        .target_residency       = 10000,
                        .power_usage            = 0,
                        .flags                  = CPUIDLE_FLAG_TIMER_STOP |
+                                                 CPUIDLE_FLAG_RCU_IDLE   |
                                                  CPUIDLE_FLAG_COUPLED,
                        .name                   = "CC6",
                        .desc                   = "CPU cluster powered off",


Reply via email to