There have been times when having local_irq_enable() in my idle loop would have prevented a hang in some of my experimental kernels, too, but it's always been because I had screwed up somewhere else and forgotten to re-enable interrupts. Is there some good reason why the kernel should end up in idle with interrupts turned off?
Regards,
Kevin K.
Yoichi Yuasa wrote:
Hi Ralf,
We need to add local_irq_enable() to cpu_idle(). Please add this patch to v2.6.
I don't have any information about R3081. I didn't fix r3081_wait().
Yoichi
Signed-off-by: Yoichi Yuasa <yuasa@xxxxxxxxxxxxxx>
diff -urN -X dontdiff a-orig/arch/mips/kernel/cpu-probe.c a/arch/mips/kernel/cpu-probe.c
--- a-orig/arch/mips/kernel/cpu-probe.c Sun Oct 31 21:49:07 2004
+++ a/arch/mips/kernel/cpu-probe.c Tue Jan 18 00:26:12 2005
@@ -42,10 +42,12 @@
{
unsigned long cfg = read_c0_conf();
write_c0_conf(cfg | TX39_CONF_HALT);
+ local_irq_enable();
}
static void r4k_wait(void)
{
+ local_irq_enable();
__asm__(".set\tmips3\n\t"
"wait\n\t"
".set\tmips0");
@@ -61,6 +63,7 @@
void au1k_wait(void)
{
+ local_irq_enable();
#ifdef CONFIG_PM
/* using the wait instruction makes CP0 counter unusable */
__asm__(".set\tmips3\n\t"
diff -urN -X dontdiff a-orig/arch/mips/kernel/process.c a/arch/mips/kernel/process.c
--- a-orig/arch/mips/kernel/process.c Sat Jan 8 23:19:16 2005
+++ a/arch/mips/kernel/process.c Mon Jan 17 21:43:08 2005
@@ -58,6 +58,8 @@
while (!need_resched())
if (cpu_wait)
(*cpu_wait)();
+ else
+ local_irq_enable();
schedule();
}
}