Skip to content

Commit

Permalink
cpuidle/powernv: avoid double irq enable coming out of idle
Browse files Browse the repository at this point in the history
Since e168979 ("cpuidle: Add common time keeping and irq enabling"),
cpuidle drivers are expected to return from ->enter with irqs disabled.

Update the cpuidle-powernv snooze and cede loops to disable irqs before
returning.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Nicholas Piggin authored and Michael Ellerman committed Jan 18, 2018
1 parent f1343d0 commit ced54c0
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions drivers/cpuidle/cpuidle-pseries.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ static inline void idle_loop_epilog(unsigned long in_purr)
get_lppaca()->wait_state_cycles = cpu_to_be64(wait_cycles);
get_lppaca()->idle = 0;

if (irqs_disabled())
local_irq_enable();
ppc64_runlatch_on();
}

Expand Down Expand Up @@ -87,6 +85,8 @@ static int snooze_loop(struct cpuidle_device *dev,
HMT_medium();
clear_thread_flag(TIF_POLLING_NRFLAG);

local_irq_disable();

idle_loop_epilog(in_purr);

return index;
Expand Down Expand Up @@ -121,6 +121,7 @@ static int dedicated_cede_loop(struct cpuidle_device *dev,
HMT_medium();
check_and_cede_processor();

local_irq_disable();
get_lppaca()->donate_dedicated_cpu = 0;

idle_loop_epilog(in_purr);
Expand All @@ -145,6 +146,7 @@ static int shared_cede_loop(struct cpuidle_device *dev,
*/
check_and_cede_processor();

local_irq_disable();
idle_loop_epilog(in_purr);

return index;
Expand Down

0 comments on commit ced54c0

Please sign in to comment.