urcu-qsbr: skip Q.S. reporting if already reported
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 11 Nov 2012 16:20:07 +0000 (11:20 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 11 Nov 2012 16:20:07 +0000 (11:20 -0500)
commitf864c15d3148f14019e837544213314db0198ccb
tree3f37e301bd33959eec7d677a1a8381d6ffd46327
parent75478b32ffe53b0d8b5e687d9cf7ebdd77a085de
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 <stern@rowland.harvard.edu>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
urcu/static/urcu-qsbr.h
This page took 0.024581 seconds and 4 git commands to generate.