struct rcu_reader *index, *tmp;
#if (BITS_PER_LONG < 64)
- /* Switch parity: 1 -> 0, 0 -> 1 */
+ /* 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.
+ */
+ barrier();
+
/*
* Wait for each thread rcu_reader_qs_gp count to become 0.
*/