On Sat, Dec 14, 2024 at 12:08:42AM +0100, Frederic Weisbecker wrote: > Le Thu, Dec 12, 2024 at 10:42:13AM -0800, Paul E. McKenney a écrit : > > From: Frederic Weisbecker <frederic@xxxxxxxxxx> > > > > It's more convenient to benefit from the fallthrough feature of > > switch / case to handle the timer state machine. Also a new state is > > about to be added that will take advantage of it. > > > > No intended functional change. > > > > Signed-off-by: Frederic Weisbecker <frederic@xxxxxxxxxx> > > Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx> > > Please drop this one too. It introduced a subtle (yet desired) behaviour > change as Boqun noted. I'll resend a better version. I will drop both on my next rebase. Uladzislau, over to you! Thanx, Paul > Thanks! > > > --- > > kernel/rcu/tree_nocb.h | 33 +++++++++++++++++++++++---------- > > 1 file changed, 23 insertions(+), 10 deletions(-) > > > > diff --git a/kernel/rcu/tree_nocb.h b/kernel/rcu/tree_nocb.h > > index 2605dd234a13c..0923d60c5a338 100644 > > --- a/kernel/rcu/tree_nocb.h > > +++ b/kernel/rcu/tree_nocb.h > > @@ -271,22 +271,35 @@ static void wake_nocb_gp_defer(struct rcu_data *rdp, int waketype, > > > > raw_spin_lock_irqsave(&rdp_gp->nocb_gp_lock, flags); > > > > - /* > > - * Bypass wakeup overrides previous deferments. In case of > > - * callback storms, no need to wake up too early. > > - */ > > - if (waketype == RCU_NOCB_WAKE_LAZY && > > - rdp->nocb_defer_wakeup == RCU_NOCB_WAKE_NOT) { > > - mod_timer(&rdp_gp->nocb_timer, jiffies + rcu_get_jiffies_lazy_flush()); > > - WRITE_ONCE(rdp_gp->nocb_defer_wakeup, waketype); > > - } else if (waketype == RCU_NOCB_WAKE_BYPASS) { > > + switch (waketype) { > > + case RCU_NOCB_WAKE_BYPASS: > > + /* > > + * Bypass wakeup overrides previous deferments. In case of > > + * callback storms, no need to wake up too early. > > + */ > > mod_timer(&rdp_gp->nocb_timer, jiffies + 2); > > WRITE_ONCE(rdp_gp->nocb_defer_wakeup, waketype); > > - } else { > > + break; > > + case RCU_NOCB_WAKE_LAZY: > > + if (rdp->nocb_defer_wakeup == RCU_NOCB_WAKE_NOT) { > > + mod_timer(&rdp_gp->nocb_timer, jiffies + rcu_get_jiffies_lazy_flush()); > > + WRITE_ONCE(rdp_gp->nocb_defer_wakeup, waketype); > > + } > > + /* > > + * If the timer is already armed, a non-lazy enqueue may have happened > > + * in-between. Don't delay it and fall-through. > > + */ > > + break; > > + case RCU_NOCB_WAKE: > > + fallthrough; > > + case RCU_NOCB_WAKE_FORCE: > > if (rdp_gp->nocb_defer_wakeup < RCU_NOCB_WAKE) > > mod_timer(&rdp_gp->nocb_timer, jiffies + 1); > > if (rdp_gp->nocb_defer_wakeup < waketype) > > WRITE_ONCE(rdp_gp->nocb_defer_wakeup, waketype); > > + break; > > + default: > > + WARN_ON_ONCE(1); > > } > > > > raw_spin_unlock_irqrestore(&rdp_gp->nocb_gp_lock, flags); > > -- > > 2.40.1 > >