RCU's rcu_iw irq-work (rcu_iw_handler()) acquires the raw spinlock
rnp->lock without disabling interrupts. The lock is held normally with
disabled interrupts for a short time.
Mark irq-work as IRQ_WORK_HARD_IRQ so it is invoked in IRQ context like
on !RT.

Reported-by: John Ogness <john.ogn...@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 kernel/rcu/tree.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 5a9c5abb17da..4fb983f4b9fd 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -1294,6 +1294,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
                    !rdp->rcu_iw_pending && rdp->rcu_iw_gpnum != rnp->gpnum &&
                    (rnp->ffmask & rdp->grpmask)) {
                        init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
+                       rdp->rcu_iw.flags = IRQ_WORK_HARD_IRQ;
                        rdp->rcu_iw_pending = true;
                        rdp->rcu_iw_gpnum = rnp->gpnum;
                        irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
-- 
2.18.0

Reply via email to