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. 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 >