SPEFloatingPointException() is the only exception handler which 'forgets' to
re-enable interrupts. This patch makes sure it does.

Suggested-by: Benjamin Herrenschmidt <b...@kernel.crashing.org>
Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/kernel/traps.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 040b60293613..ea552793fe44 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -1997,6 +1997,10 @@ void SPEFloatingPointException(struct pt_regs *regs)
        int code = FPE_FLTUNK;
        int err;
 
+       /* We restore the interrupt state now */
+       if (!arch_irq_disabled_regs(regs))
+               local_irq_enable();
+
        flush_spe_to_thread(current);
 
        spefscr = current->thread.spefscr;
@@ -2042,6 +2046,10 @@ void SPEFloatingPointRoundException(struct pt_regs *regs)
        extern int speround_handler(struct pt_regs *regs);
        int err;
 
+       /* We restore the interrupt state now */
+       if (!arch_irq_disabled_regs(regs))
+               local_irq_enable();
+
        preempt_disable();
        if (regs->msr & MSR_SPE)
                giveup_spe(current);
-- 
2.13.3

Reply via email to