From 3147093e1de59081e82fb1d815424c3e952caf3e Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Fri, 18 Dec 2009 14:19:27 +0900 Subject: [PATCH 1/2] sh: Restore bl bit toggling in idle loop. This fixes up some crashes with IRQs racing the need_resched() test under QEMU. Signed-off-by: Paul Mundt --- arch/sh/kernel/idle.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index aaff0037fcd7..8e47565dcfd1 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c @@ -92,6 +92,7 @@ void cpu_idle(void) check_pgt_cache(); rmb(); + set_bl_bit(); local_irq_disable(); /* Don't trace irqs off for idle */ stop_critical_timings(); @@ -102,6 +103,7 @@ void cpu_idle(void) */ WARN_ON(irqs_disabled()); start_critical_timings(); + clear_bl_bit(); } tick_nohz_restart_sched_tick(); From 73a38b839b9295216e8d44dabf54de88270e77b8 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Fri, 18 Dec 2009 14:40:56 +0900 Subject: [PATCH 2/2] sh: Only use bl bit toggling for sleeping idle. We don't actually require this in the cpu_relax() polling case, so just cuddle these around the sleeping version. Signed-off-by: Paul Mundt --- arch/sh/kernel/idle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index 8e47565dcfd1..6b3d706deac1 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c @@ -62,6 +62,7 @@ void default_idle(void) clear_thread_flag(TIF_POLLING_NRFLAG); smp_mb__after_clear_bit(); + set_bl_bit(); if (!need_resched()) { local_irq_enable(); cpu_sleep(); @@ -69,6 +70,7 @@ void default_idle(void) local_irq_enable(); set_thread_flag(TIF_POLLING_NRFLAG); + clear_bl_bit(); } else poll_idle(); } @@ -92,7 +94,6 @@ void cpu_idle(void) check_pgt_cache(); rmb(); - set_bl_bit(); local_irq_disable(); /* Don't trace irqs off for idle */ stop_critical_timings(); @@ -103,7 +104,6 @@ void cpu_idle(void) */ WARN_ON(irqs_disabled()); start_critical_timings(); - clear_bl_bit(); } tick_nohz_restart_sched_tick();