cpuidle/powernv: avoid double irq enable coming out of idle
Since e1689795a7
("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>
This commit is contained in:

committed by
Michael Ellerman

parent
f1343d0446
commit
ced54c08d8
@@ -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()->wait_state_cycles = cpu_to_be64(wait_cycles);
|
||||||
get_lppaca()->idle = 0;
|
get_lppaca()->idle = 0;
|
||||||
|
|
||||||
if (irqs_disabled())
|
|
||||||
local_irq_enable();
|
|
||||||
ppc64_runlatch_on();
|
ppc64_runlatch_on();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +85,8 @@ static int snooze_loop(struct cpuidle_device *dev,
|
|||||||
HMT_medium();
|
HMT_medium();
|
||||||
clear_thread_flag(TIF_POLLING_NRFLAG);
|
clear_thread_flag(TIF_POLLING_NRFLAG);
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
idle_loop_epilog(in_purr);
|
idle_loop_epilog(in_purr);
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
@@ -121,6 +121,7 @@ static int dedicated_cede_loop(struct cpuidle_device *dev,
|
|||||||
HMT_medium();
|
HMT_medium();
|
||||||
check_and_cede_processor();
|
check_and_cede_processor();
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
get_lppaca()->donate_dedicated_cpu = 0;
|
get_lppaca()->donate_dedicated_cpu = 0;
|
||||||
|
|
||||||
idle_loop_epilog(in_purr);
|
idle_loop_epilog(in_purr);
|
||||||
@@ -145,6 +146,7 @@ static int shared_cede_loop(struct cpuidle_device *dev,
|
|||||||
*/
|
*/
|
||||||
check_and_cede_processor();
|
check_and_cede_processor();
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
idle_loop_epilog(in_purr);
|
idle_loop_epilog(in_purr);
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
|
Reference in New Issue
Block a user