Message ID | 20241212184214.2018411-1-paulmck@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | No-CB changes for v6.14 | expand |
Le Thu, Dec 12, 2024 at 10:42:13AM -0800, Paul E. McKenney a écrit : > From: Frederic Weisbecker <frederic@kernel.org> > > 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@kernel.org> > Signed-off-by: Paul E. McKenney <paulmck@kernel.org> 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 >
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@kernel.org> > > > > 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@kernel.org> > > Signed-off-by: Paul E. McKenney <paulmck@kernel.org> > > 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 > >
On Fri, Dec 13, 2024 at 03:29:16PM -0800, Paul E. McKenney wrote: > 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@kernel.org> > > > > > > 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@kernel.org> > > > Signed-off-by: Paul E. McKenney <paulmck@kernel.org> > > > > 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! > Thank you. Dropped both. -- Uladzislau Rezki
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);