From: Mathieu Desnoyers Date: Sun, 11 Nov 2012 16:20:07 +0000 (-0500) Subject: urcu-qsbr: skip Q.S. reporting if already reported X-Git-Tag: v0.8.0~155 X-Git-Url: https://git.liburcu.org/?a=commitdiff_plain;h=f864c15d3148f14019e837544213314db0198ccb;hp=f864c15d3148f14019e837544213314db0198ccb;p=urcu.git urcu-qsbr: skip Q.S. reporting if already reported We can skip both memory barriers and store reporting quiescent state if we notice we already reported Q.S. for the current value of "rcu_gp_ctr". It covers the two implementations of QSBR: * 64-bit architecture: we assume the counter never overflows, and therefore only perform one increment followed by waiting for readers. In this scenario, we don't care if the rcu_gp_ctr load is moved into the prior read-side critical section, as long as the URCU_TLS(rcu_reader).ctr store is ordered. * 32-bit architecture: given the 32-bit counter could overflow, we rely on a 2-phase approach, using a single bit: we flip the rcu_gp_ctr bit, then wait to observe that all readers have taken a copy of the new rcu_gp_ctr. We flip it again, and wait until we observe that all readers have copied its new value. We are then certain that each reader necessarily passed through a quiescent state during the grace period (and that Q.S. was not located prior to our grace period). This scheme works even if the rcu_gp_ctr load is moved into the prior read-side critical section, as long as store to URCU_TLS(rcu_reader).ctr is ordered with respect to other memory accesses within that thread. Suggested-by: Alan Stern Signed-off-by: Mathieu Desnoyers Acked-by: Alan Stern Acked-by: Paul E. McKenney ---