1e64b15a4b10 ("rcu: Fix grace-period hangs due to race with CPU offline") added spinlock_t ofl_lock to the rcu_state structure, then takes it with preemption disabled during CPU offline, giving RT sleeping lock heartburn.
Convert it to raw_spinlock_t. Signed-off-by: Mike Galbraith <efa...@gmx.de> --- kernel/rcu/tree.c | 12 ++++++------ kernel/rcu/tree.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -111,7 +111,7 @@ struct rcu_state sname##_state = { \ .abbr = sabbr, \ .exp_mutex = __MUTEX_INITIALIZER(sname##_state.exp_mutex), \ .exp_wake_mutex = __MUTEX_INITIALIZER(sname##_state.exp_wake_mutex), \ - .ofl_lock = __SPIN_LOCK_UNLOCKED(sname##_state.ofl_lock), \ + .ofl_lock = __RAW_SPIN_LOCK_UNLOCKED(sname##_state.ofl_lock), \ } RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched); @@ -1962,13 +1962,13 @@ static bool rcu_gp_init(struct rcu_state */ rsp->gp_state = RCU_GP_ONOFF; rcu_for_each_leaf_node(rsp, rnp) { - spin_lock(&rsp->ofl_lock); + raw_spin_lock(&rsp->ofl_lock); raw_spin_lock_irq_rcu_node(rnp); if (rnp->qsmaskinit == rnp->qsmaskinitnext && !rnp->wait_blkd_tasks) { /* Nothing to do on this leaf rcu_node structure. */ raw_spin_unlock_irq_rcu_node(rnp); - spin_unlock(&rsp->ofl_lock); + raw_spin_unlock(&rsp->ofl_lock); continue; } @@ -2004,7 +2004,7 @@ static bool rcu_gp_init(struct rcu_state } raw_spin_unlock_irq_rcu_node(rnp); - spin_unlock(&rsp->ofl_lock); + raw_spin_unlock(&rsp->ofl_lock); } rcu_gp_slow(rsp, gp_preinit_delay); /* Races with CPU hotplug. */ @@ -3892,7 +3892,7 @@ static void rcu_cleanup_dying_idle_cpu(i /* Remove outgoing CPU from mask in the leaf rcu_node structure. */ mask = rdp->grpmask; - spin_lock(&rsp->ofl_lock); + raw_spin_lock(&rsp->ofl_lock); raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */ rdp->rcu_ofl_gp_seq = READ_ONCE(rsp->gp_seq); rdp->rcu_ofl_gp_flags = READ_ONCE(rsp->gp_flags); @@ -3903,7 +3903,7 @@ static void rcu_cleanup_dying_idle_cpu(i } rnp->qsmaskinitnext &= ~mask; raw_spin_unlock_irqrestore_rcu_node(rnp, flags); - spin_unlock(&rsp->ofl_lock); + raw_spin_unlock(&rsp->ofl_lock); } /* --- a/kernel/rcu/tree.h +++ b/kernel/rcu/tree.h @@ -368,7 +368,7 @@ struct rcu_state { char abbr; /* Abbreviated name. */ struct list_head flavors; /* List of RCU flavors. */ - spinlock_t ofl_lock ____cacheline_internodealigned_in_smp; + raw_spinlock_t ofl_lock ____cacheline_internodealigned_in_smp; /* Synchronize offline with */ /* GP pre-initialization. */ };