On Fri, Feb 14, 2020 at 10:53:05PM -0500, Steven Rostedt wrote: > On Fri, 14 Feb 2020 15:55:59 -0800 > paulmck@xxxxxxxxxx wrote: > > > @@ -1252,10 +1252,10 @@ static bool rcu_future_gp_cleanup(struct rcu_node *rnp) > > */ > > static void rcu_gp_kthread_wake(void) > > { > > - if ((current == rcu_state.gp_kthread && > > + if ((current == READ_ONCE(rcu_state.gp_kthread) && > > !in_irq() && !in_serving_softirq()) || > > !READ_ONCE(rcu_state.gp_flags) || > > - !rcu_state.gp_kthread) > > + !READ_ONCE(rcu_state.gp_kthread)) > > return; > > This looks buggy. You have two instances of > READ_ONCE(rcu_state.gp_thread), which means they can be different. Is > that intentional? It might well be a bug, but let's see... The rcu_state.gp_kthread field is initially NULL and transitions only once to the non-NULL pointer to the RCU grace-period kthread's task_struct structure. So yes, this does work, courtesy of the compiler not being allowed to change the order of READ_ONCE() instances and conherence-order rules for READ_ONCE() and WRITE_ONCE(). But it would clearly be way better to do just one READ_ONCE() into a local variable and test that local variable twice. I will make this change, and thank you for calling my attention to it! Thanx, Paul