On Mon, Aug 19, 2019 at 07:46:32AM -0700, Paul E. McKenney wrote: > On Mon, Aug 19, 2019 at 02:38:38PM +0200, Frederic Weisbecker wrote: > > On Thu, Aug 15, 2019 at 10:53:09PM -0400, Joel Fernandes (Google) wrote: > > > This commit fixes the issue. > > > > > > Signed-off-by: Joel Fernandes (Google) <j...@joelfernandes.org> > > > --- > > > kernel/rcu/tree.c | 29 +++++++++++++++++------------ > > > 1 file changed, 17 insertions(+), 12 deletions(-) > > > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > > index 0512de9ead20..322b1b57967c 100644 > > > --- a/kernel/rcu/tree.c > > > +++ b/kernel/rcu/tree.c > > > @@ -829,7 +829,7 @@ static __always_inline void rcu_nmi_enter_common(bool > > > irq) > > > !rdp->dynticks_nmi_nesting && > > > rdp->rcu_urgent_qs && !rdp->rcu_forced_tick) { > > > rdp->rcu_forced_tick = true; > > > - tick_dep_set_cpu(rdp->cpu, TICK_DEP_MASK_RCU); > > > + tick_dep_set_cpu(rdp->cpu, TICK_DEP_BIT_RCU); > > > > Did I suggest you to use the _MASK_ value? That was a bit mean. > > Sorry for all that lost debugging time :-( > > At some point, I should have looked at the other calls to these > functions. :-/ > > But would the following patch make sense? This would not help for (say) > use of TICK_MASK_BIT_POSIX_TIMER instead of TICK_DEP_BIT_POSIX_TIMER, but > would help for any new values that might be added later on. And currently > for TICK_DEP_MASK_CLOCK_UNSTABLE and TICK_DEP_MASK_RCU.
I'd rather make the TICK_DEP_MASK_* values private to kernel/time/tick-sched.c but that means I need to re-arrange a bit include/trace/events/timer.h I'm looking into it. Meanwhile, your below patch that checks for the max value is still valuable. Thanks. > > Thanx, Paul > > ------------------------------------------------------------------------ > > diff --git a/include/linux/tick.h b/include/linux/tick.h > index 39eb44564058..4ed788ce5762 100644 > --- a/include/linux/tick.h > +++ b/include/linux/tick.h > @@ -111,6 +111,7 @@ enum tick_dep_bits { > TICK_DEP_BIT_CLOCK_UNSTABLE = 3, > TICK_DEP_BIT_RCU = 4 > }; > +#define TICK_DEP_BIT_MAX TICK_DEP_BIT_RCU > > #define TICK_DEP_MASK_NONE 0 > #define TICK_DEP_MASK_POSIX_TIMER (1 << TICK_DEP_BIT_POSIX_TIMER) > @@ -215,24 +216,28 @@ extern void tick_nohz_dep_clear_signal(struct > signal_struct *signal, > */ > static inline void tick_dep_set(enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_set(bit); > } > > static inline void tick_dep_clear(enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_clear(bit); > } > > static inline void tick_dep_set_cpu(int cpu, enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_cpu(cpu)) > tick_nohz_dep_set_cpu(cpu, bit); > } > > static inline void tick_dep_clear_cpu(int cpu, enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_cpu(cpu)) > tick_nohz_dep_clear_cpu(cpu, bit); > } > @@ -240,24 +245,28 @@ static inline void tick_dep_clear_cpu(int cpu, enum > tick_dep_bits bit) > static inline void tick_dep_set_task(struct task_struct *tsk, > enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_set_task(tsk, bit); > } > static inline void tick_dep_clear_task(struct task_struct *tsk, > enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_clear_task(tsk, bit); > } > static inline void tick_dep_set_signal(struct signal_struct *signal, > enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_set_signal(signal, bit); > } > static inline void tick_dep_clear_signal(struct signal_struct *signal, > enum tick_dep_bits bit) > { > + WARN_ON_ONCE(bit > TICK_DEP_BIT_MAX); > if (tick_nohz_full_enabled()) > tick_nohz_dep_clear_signal(signal, bit); > }