Commit 43ba2237 authored by Max Filippov's avatar Max Filippov
Browse files

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: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent ed5aacc8
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ void do_interrupt(struct pt_regs *regs)
		XCHAL_INTLEVEL7_MASK,
	};
	struct pt_regs *old_regs;
	unsigned unhandled = ~0u;

	trace_hardirqs_off();

@@ -283,6 +284,10 @@ void do_interrupt(struct pt_regs *regs)
		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;
			}
		}
@@ -290,6 +295,8 @@ void do_interrupt(struct pt_regs *regs)
		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);
	}