]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
counter: interrupt-cnt: Drop IRQF_NO_THREAD flag
authorAlexander Sverdlin <alexander.sverdlin@siemens.com>
Tue, 18 Nov 2025 08:35:48 +0000 (09:35 +0100)
committerWilliam Breathitt Gray <wbg@kernel.org>
Mon, 22 Dec 2025 10:39:58 +0000 (19:39 +0900)
An IRQ handler can either be IRQF_NO_THREAD or acquire spinlock_t, as
CONFIG_PROVE_RAW_LOCK_NESTING warns:
=============================
[ BUG: Invalid wait context ]
6.18.0-rc1+git... #1
-----------------------------
some-user-space-process/1251 is trying to lock:
(&counter->events_list_lock){....}-{3:3}, at: counter_push_event [counter]
other info that might help us debug this:
context-{2:2}
no locks held by some-user-space-process/....
stack backtrace:
CPU: 0 UID: 0 PID: 1251 Comm: some-user-space-process 6.18.0-rc1+git... #1 PREEMPT
Call trace:
 show_stack (C)
 dump_stack_lvl
 dump_stack
 __lock_acquire
 lock_acquire
 _raw_spin_lock_irqsave
 counter_push_event [counter]
 interrupt_cnt_isr [interrupt_cnt]
 __handle_irq_event_percpu
 handle_irq_event
 handle_simple_irq
 handle_irq_desc
 generic_handle_domain_irq
 gpio_irq_handler
 handle_irq_desc
 generic_handle_domain_irq
 gic_handle_irq
 call_on_irq_stack
 do_interrupt_handler
 el0_interrupt
 __el0_irq_handler_common
 el0t_64_irq_handler
 el0t_64_irq

... and Sebastian correctly points out. Remove IRQF_NO_THREAD as an
alternative to switching to raw_spinlock_t, because the latter would limit
all potential nested locks to raw_spinlock_t only.

Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20251117151314.xwLAZrWY@linutronix.de/
Fixes: a55ebd47f21f ("counter: add IRQ or GPIO based counter")
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://lore.kernel.org/r/20251118083603.778626-1-alexander.sverdlin@siemens.com
Signed-off-by: William Breathitt Gray <wbg@kernel.org>
drivers/counter/interrupt-cnt.c

index 6c0c1d2d7027d5b57878e86587f8f8399e2b7675..e6100b5fb082e0a707c07cfac4806807ad131462 100644 (file)
@@ -229,8 +229,7 @@ static int interrupt_cnt_probe(struct platform_device *pdev)
 
        irq_set_status_flags(priv->irq, IRQ_NOAUTOEN);
        ret = devm_request_irq(dev, priv->irq, interrupt_cnt_isr,
-                              IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
-                              dev_name(dev), counter);
+                              IRQF_TRIGGER_RISING, dev_name(dev), counter);
        if (ret)
                return ret;