+ struct rcu_reader *index, *tmp;
+
+#if (BITS_PER_LONG < 64)
+ /* Switch parity: 0 -> 1, 1 -> 0 */
+ STORE_SHARED(rcu_gp_ctr, rcu_gp_ctr ^ RCU_GP_CTR);
+#else /* !(BITS_PER_LONG < 64) */
+ /* Increment current G.P. */
+ STORE_SHARED(rcu_gp_ctr, rcu_gp_ctr + RCU_GP_CTR);
+#endif /* !(BITS_PER_LONG < 64) */
+
+ /*
+ * Enforce compiler-order of store to rcu_gp_ctr before before
+ * load rcu_reader ctr.
+ * This ensures synchronize_rcu() cannot be starved by readers.
+ *
+ * Adding a smp_mb() which is _not_ formally required, but makes the
+ * model easier to understand. It does not have a big performance impact
+ * anyway, given this is the write-side.
+ */
+ smp_mb();