[PATCH Dovetail v4 5/8] genirq: irq_pipeline: Decouple kernel/irq/pipeline.c from irqstate bit definitions
Florian Bezdeka <[email protected]> Tue, 07 Jul 2026 11:50:21 +0200
| Newsgroups | dev.linux.lists.xenomai |
|---|---|
| Message-ID | <20260707-wip-flo-v7-1-arm-pipelining-fixes-v4-5-057b8af5a2ca@siemens.com> |
This only affects architectures where CONFIG_GENERIC_ENTRY is not set. Moving the stall bit definitions into the architecture specific implementations allows re-use of those definition within the arch specifics. Moving the defines to include/linux/irq_pipeline.h turned out to trigger a lot of trouble as re-use will live in asm/ where including a "general" header is quite hard. The platform independent implementation will now need the following arch specific hooks, all operating on the platform specific struct pt_regs: - arch_kentry_test_stalled() - arch_kentry_test_hardirq() - arch_kentry_clear_irq_state() - arch_kentry_set_stalled() - arch_kentry_set_hardirq() Signed-off-by: Florian Bezdeka <[email protected]> --- kernel/irq/pipeline.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/kernel/irq/pipeline.c b/kernel/irq/pipeline.c index ced7003a8444125ff38d71bf867ce34cfa0235f1..de401973c623017347468e429e19b45d4b069524 100644 --- a/kernel/irq/pipeline.c +++ b/kernel/irq/pipeline.c @@ -1401,33 +1401,26 @@ void sync_current_irq_stage(void) /* hard irqs off */ * in kernel context, indexed on the current register frame. */ -#define KENTRY_STALL_BIT BIT(0) /* Tracks INBAND_STALL_BIT */ -#define KENTRY_LOCKDEP_BIT BIT(1) /* Tracks hardirqs_enabled */ - asmlinkage __visible noinstr void kentry_enter_pipelined(struct pt_regs *regs) { - long irqstate = 0; - WARN_ON(irq_pipeline_debug() && !hard_irqs_disabled()); if (!running_inband()) return; + arch_kentry_clear_irq_state(regs); + if (lockdep_read_irqs_state()) - irqstate |= KENTRY_LOCKDEP_BIT; + arch_kentry_set_hardirq(regs); if (irqs_disabled()) - irqstate |= KENTRY_STALL_BIT; + arch_kentry_set_stalled(regs); else trace_hardirqs_off(); - - arch_kentry_set_irqstate(regs, irqstate); } asmlinkage void __visible noinstr kentry_exit_pipelined(struct pt_regs *regs) { - long irqstate; - WARN_ON(irq_pipeline_debug() && !hard_irqs_disabled()); if (!running_inband()) @@ -1444,13 +1437,12 @@ asmlinkage void __visible noinstr kentry_exit_pipelined(struct pt_regs *regs) * do flip the stall bit, but are not tracked by lockdep). */ - irqstate = arch_kentry_get_irqstate(regs); - if (!(irqstate & KENTRY_STALL_BIT)) { + if (!arch_kentry_test_stalled(regs)) { stall_inband_nocheck(); trace_hardirqs_on(); unstall_inband_nocheck(); } else { - lockdep_write_irqs_state(!!(irqstate & KENTRY_LOCKDEP_BIT)); + lockdep_write_irqs_state(arch_kentry_test_hardirq(regs)); } } -- 2.55.0