lkml.org 
[lkml]   [2023]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 04/51] cpuidle: Move IRQ state validation
    Make cpuidle_enter_state() consistent with the s2idle variant and
    verify ->enter() always returns with interrupts disabled.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: Frederic Weisbecker <frederic@kernel.org>
    Tested-by: Tony Lindgren <tony@atomide.com>
    Tested-by: Ulf Hansson <ulf.hansson@linaro.org>
    ---
    drivers/cpuidle/cpuidle.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    --- a/drivers/cpuidle/cpuidle.c
    +++ b/drivers/cpuidle/cpuidle.c
    @@ -236,7 +236,11 @@ int cpuidle_enter_state(struct cpuidle_d
    stop_critical_timings();
    if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
    ct_idle_enter();
    +
    entered_state = target_state->enter(dev, drv, index);
    + if (WARN_ONCE(!irqs_disabled(), "%ps leaked IRQ state", target_state->enter))
    + raw_local_irq_disable();
    +
    if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
    ct_idle_exit();
    start_critical_timings();
    @@ -248,12 +252,8 @@ int cpuidle_enter_state(struct cpuidle_d
    /* The cpu is no longer idle or about to enter idle. */
    sched_idle_set_state(NULL);

    - if (broadcast) {
    - if (WARN_ON_ONCE(!irqs_disabled()))
    - local_irq_disable();
    -
    + if (broadcast)
    tick_broadcast_exit();
    - }

    if (!cpuidle_state_is_coupled(drv, index))
    local_irq_enable();

    \
     
     \ /
      Last update: 2023-03-26 23:38    [W:2.766 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site