cpuidle, armada: Push RCU-idle into driver
authorPeter Zijlstra <peterz@infradead.org>
Thu, 12 Jan 2023 19:43:24 +0000 (20:43 +0100)
committerIngo Molnar <mingo@kernel.org>
Fri, 13 Jan 2023 10:47:27 +0000 (11:47 +0100)
Doing RCU-idle outside the driver, only to then temporarily enable it
again before going idle is suboptimal.

Notably the cpu_pm_*() calls implicitly re-enable RCU for a bit.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20230112195539.946630819@infradead.org
drivers/cpuidle/cpuidle-mvebu-v7.c

index 01a856971f05b8af0b470508dbade67981292392..c9568aa9410c11864236ebefdaaf282cf437dd26 100644 (file)
@@ -36,7 +36,10 @@ static int mvebu_v7_enter_idle(struct cpuidle_device *dev,
        if (drv->states[index].flags & MVEBU_V7_FLAG_DEEP_IDLE)
                deepidle = true;
 
+       ct_idle_enter();
        ret = mvebu_v7_cpu_suspend(deepidle);
+       ct_idle_exit();
+
        cpu_pm_exit();
 
        if (ret)
@@ -49,6 +52,7 @@ static struct cpuidle_driver armadaxp_idle_driver = {
        .name                   = "armada_xp_idle",
        .states[0]              = ARM_CPUIDLE_WFI_STATE,
        .states[1]              = {
+               .flags                  = CPUIDLE_FLAG_RCU_IDLE,
                .enter                  = mvebu_v7_enter_idle,
                .exit_latency           = 100,
                .power_usage            = 50,
@@ -57,6 +61,7 @@ static struct cpuidle_driver armadaxp_idle_driver = {
                .desc                   = "CPU power down",
        },
        .states[2]              = {
+               .flags                  = CPUIDLE_FLAG_RCU_IDLE,
                .enter                  = mvebu_v7_enter_idle,
                .exit_latency           = 1000,
                .power_usage            = 5,
@@ -72,6 +77,7 @@ static struct cpuidle_driver armada370_idle_driver = {
        .name                   = "armada_370_idle",
        .states[0]              = ARM_CPUIDLE_WFI_STATE,
        .states[1]              = {
+               .flags                  = CPUIDLE_FLAG_RCU_IDLE,
                .enter                  = mvebu_v7_enter_idle,
                .exit_latency           = 100,
                .power_usage            = 5,
@@ -87,6 +93,7 @@ static struct cpuidle_driver armada38x_idle_driver = {
        .name                   = "armada_38x_idle",
        .states[0]              = ARM_CPUIDLE_WFI_STATE,
        .states[1]              = {
+               .flags                  = CPUIDLE_FLAG_RCU_IDLE,
                .enter                  = mvebu_v7_enter_idle,
                .exit_latency           = 10,
                .power_usage            = 5,