[PATCH RT] rcu: mark rcu_iw_handler() as IRQ_WORK_HARD_IRQ

From: Sebastian Andrzej Siewior
Date: Mon Jul 30 2018 - 15:28:31 EST


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.ogness@xxxxxxxxxxxxx>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
---
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