Skip to content

Commit 43ba223

Browse files
committed
xtensa: add fairness to IRQ handling
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>
1 parent ed5aacc commit 43ba223

1 file changed

Lines changed: 7 additions & 0 deletions

File tree

arch/xtensa/kernel/traps.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ void do_interrupt(struct pt_regs *regs)
268268
XCHAL_INTLEVEL7_MASK,
269269
};
270270
struct pt_regs *old_regs;
271+
unsigned unhandled = ~0u;
271272

272273
trace_hardirqs_off();
273274

@@ -283,13 +284,19 @@ void do_interrupt(struct pt_regs *regs)
283284
for (level = LOCKLEVEL; level > 0; --level) {
284285
if (int_at_level & int_level_mask[level]) {
285286
int_at_level &= int_level_mask[level];
287+
if (int_at_level & unhandled)
288+
int_at_level &= unhandled;
289+
else
290+
unhandled |= int_level_mask[level];
286291
break;
287292
}
288293
}
289294

290295
if (level == 0)
291296
break;
292297

298+
/* clear lowest pending irq in the unhandled mask */
299+
unhandled ^= (int_at_level & -int_at_level);
293300
do_IRQ(__ffs(int_at_level), regs);
294301
}
295302

0 commit comments

Comments
 (0)