sh: Need IRQs enabled for init_fpu().
authorPaul Mundt <lethal@linux-sh.org>
Mon, 18 Jan 2010 11:39:49 +0000 (20:39 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 18 Jan 2010 11:39:49 +0000 (20:39 +0900)
This tosses in a local_irq_enable()/disable() pair around the init_fpu()
callsite in the FPU state restore exception handler. Fixes up a slab BUG
triggered by making a slab cache allocation that can sleep whilst
irqs_disabled(). This follows the behaviour undertaken by the x86
implementation.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/kernel/cpu/fpu.c

index c23e6727002a470928741c3782d4f06e4774bc8b..f059ed62cf57176cbae60d679a16436dff2793c3 100644 (file)
@@ -56,6 +56,7 @@ void fpu_state_restore(struct pt_regs *regs)
        }
 
        if (!tsk_used_math(tsk)) {
+               local_irq_enable();
                /*
                 * does a slab alloc which can sleep
                 */
@@ -66,6 +67,7 @@ void fpu_state_restore(struct pt_regs *regs)
                        do_group_exit(SIGKILL);
                        return;
                }
+               local_irq_disable();
        }
 
        grab_fpu(regs);