Track which IRQs have been served at each level to make sure that no IRQ
is served more than once while other IRQs at the same level are pending.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
                XCHAL_INTLEVEL7_MASK,
        };
        struct pt_regs *old_regs;
+       unsigned unhandled = ~0u;
 
        trace_hardirqs_off();
 
                for (level = LOCKLEVEL; level > 0; --level) {
                        if (int_at_level & int_level_mask[level]) {
                                int_at_level &= int_level_mask[level];
+                               if (int_at_level & unhandled)
+                                       int_at_level &= unhandled;
+                               else
+                                       unhandled |= int_level_mask[level];
                                break;
                        }
                }
                if (level == 0)
                        break;
 
+               /* clear lowest pending irq in the unhandled mask */
+               unhandled ^= (int_at_level & -int_at_level);
                do_IRQ(__ffs(int_at_level), regs);
        }