On Fri, Jun 28, 2013 at 01:25:17AM +0530, Srivatsa S. Bhat wrote: > In RCU code, rcu_implicit_dynticks_qs() checks if a CPU is offline, > while being protected by a spinlock. At first, it appears as if we need to > use the get/put_online_cpus_atomic() APIs to properly synchronize with CPU > hotplug, once we get rid of stop_machine(). However, RCU has adequate > synchronization with CPU hotplug, making that unnecessary. But since the > locking details are non-trivial, it is hard to teach this to the rudimentary > hotplug locking validator. > > So use the _nocheck() variants of the cpu accessor functions to prevent false- > positive warnings from the CPU hotplug debug code. Also, add a comment > explaining the hotplug synchronization design used in RCU, so that its easy > to see why it is justified to use the _nocheck() variants. > > Cc: Dipankar Sarma <dipankar@xxxxxxxxxx> > Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> Reviewed-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx> > --- > > kernel/rcutree.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/kernel/rcutree.c b/kernel/rcutree.c > index cf3adc6..ced28a45 100644 > --- a/kernel/rcutree.c > +++ b/kernel/rcutree.c > @@ -794,7 +794,17 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) > if (ULONG_CMP_GE(rdp->rsp->gp_start + 2, jiffies)) > return 0; /* Grace period is not old enough. */ > barrier(); > - if (cpu_is_offline(rdp->cpu)) { > + > + /* > + * It is safe to use the _nocheck() version of cpu_is_offline() here > + * (to avoid false-positive warnings from CPU hotplug debug code), > + * because: > + * 1. rcu_gp_init() holds off CPU hotplug operations during grace > + * period initialization. > + * 2. The current grace period has not ended yet. > + * So it is safe to sample the offline state without synchronization. > + */ > + if (cpu_is_offline_nocheck(rdp->cpu)) { > trace_rcu_fqs(rdp->rsp->name, rdp->gpnum, rdp->cpu, "ofl"); > rdp->offline_fqs++; > return 1; > -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html