[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 07/36] cpuidle,tegra: Push RCU-idle into driver



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) <peterz@xxxxxxxxxxxxx>
---
 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",





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.