*/
/*
+ * 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.
{
rcu_reader.tid = pthread_self();
assert(rcu_reader.need_mb == 0);
- assert(rcu_reader.ctr == 0);
+ assert(!(rcu_reader.ctr & RCU_GP_CTR_NEST_MASK));
mutex_lock(&rcu_gp_lock);
rcu_init(); /* In case gcc does not support constructor attribute */