- /*
- * Finish using rcu before decrementing the pointer.
- */
- cmm_smp_mb();
- _CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, URCU_TLS(rcu_reader)->ctr - RCU_GP_COUNT);
+ unsigned long tmp;
+
+ tmp = URCU_TLS(rcu_reader)->ctr;
+ urcu_assert(tmp & RCU_GP_CTR_NEST_MASK);
+ /* Finish using rcu before decrementing the pointer. */
+ urcu_bp_smp_mb_slave();
+ _CMM_STORE_SHARED(URCU_TLS(rcu_reader)->ctr, tmp - RCU_GP_COUNT);