Messages in this thread | | | Date | Sun, 12 Oct 2008 17:52:56 +0200 | From | Manfred Spraul <> | Subject | Re: [PATCH, RFC] v7 scalable classic RCU implementation |
| |
Paul E. McKenney wrote: > +/* > + * If the specified CPU is offline, tell the caller that it is in > + * a quiescent state. Otherwise, whack it with a reschedule IPI. > + * Grace periods can end up waiting on an offline CPU when that > + * CPU is in the process of coming online -- it will be added to the > + * rcu_node bitmasks before it actually makes it online. Because this > + * race is quite rare, we check for it after detecting that the grace > + * period has been delayed rather than checking each and every CPU > + * each and every time we start a new grace period. > + */ What about using CPU_DYING and CPU_STARTING?
Then this race wouldn't exist anymore. > +static void force_quiescent_state(struct rcu_state *rsp, int relaxed) > +{ > + [snip] > + case RCU_FORCE_QS: > + > + /* Check dyntick-idle state, send IPI to laggarts. */ > + if (rcu_process_dyntick(rsp, > dyntick_recall_completed(rsp), > + rcu_implicit_dynticks_qs)) > + goto unlock_ret; > + > + /* Leave state in case more forcing is required. */ > + > + break; Hmm - your code must loop multiple times over the cpus. I've use a different approach: More forcing is only required for a nohz cpu when it was hit within a long-running interrupt. Thus I've added a '->kick_poller' flag, rcu_irq_exit() reports back when the long-running interrupt completes. Never more than one loop over the outstanding cpus is required.
-- Manfred
| |