Re: [PATCH, RFC] v7 scalable classic RCU implementation

From: Manfred Spraul
Date: Sun Oct 12 2008 - 11:51:40 EST


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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/