set_irq_regs() is called by do_IRQ() while irq_enter() and irq_exit()
are called by __do_irq().

Move set_irq_regs() in __do_irq()

Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/kernel/irq.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 410accba865d..28414c6665cc 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -647,6 +647,7 @@ static inline void call_do_irq(struct pt_regs *regs, void 
*sp)
 
 void __do_irq(struct pt_regs *regs)
 {
+       struct pt_regs *old_regs = set_irq_regs(regs);
        unsigned int irq;
 
        irq_enter();
@@ -672,11 +673,11 @@ void __do_irq(struct pt_regs *regs)
        trace_irq_exit(regs);
 
        irq_exit();
+       set_irq_regs(old_regs);
 }
 
 void do_IRQ(struct pt_regs *regs)
 {
-       struct pt_regs *old_regs = set_irq_regs(regs);
        void *cursp, *irqsp, *sirqsp;
 
        /* Switch to the irq stack to handle this */
@@ -686,16 +687,11 @@ void do_IRQ(struct pt_regs *regs)
 
        check_stack_overflow();
 
-       /* Already there ? */
-       if (unlikely(cursp == irqsp || cursp == sirqsp)) {
+       /* Already there ? Otherwise switch stack and call */
+       if (unlikely(cursp == irqsp || cursp == sirqsp))
                __do_irq(regs);
-               set_irq_regs(old_regs);
-               return;
-       }
-       /* Switch stack and call */
-       call_do_irq(regs, irqsp);
-
-       set_irq_regs(old_regs);
+       else
+               call_do_irq(regs, irqsp);
 }
 
 void __init init_IRQ(void)
-- 
2.13.3

Reply via email to