From: Mathieu Desnoyers Date: Sat, 3 Sep 2011 13:15:14 +0000 (-0400) Subject: Revert "CDS API: removal of rcu_read lock/unlock dep, removal of call_rcu argument... X-Git-Tag: v0.6.5~37 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=6e5f88cf94a225b155719046d87bfd32ba47e06a;hp=6e5f88cf94a225b155719046d87bfd32ba47e06a Revert "CDS API: removal of rcu_read lock/unlock dep, removal of call_rcu argument from init" This reverts commit 7618919ae496bda84a2efa4f2ad0abe569892a9e. Rationale: I thought about it some more, and had discussions with various people, and there are a few reasons to go for a scheme where rcu read lock should be taken by the caller, and to pass call_rcu as a parameter to the data structure init function: A) The advantage, as Paul E. McKenney pointed out, is that one single .so is enough to support all RCU flavors. Very convenient for external data structure containers. B) It clearly documents where rcu read-side locks are needed, so the user keep control and in-depth understanding of their read-side locks. C) When multiple API functions that require RCU read-side lock to be held (sometimes even the same lock) throughout a sequence of API calls, we have no choice but to let the caller hold the read-side lock. D) Due to support of multiple nesting of rcu read-side lock, any "improvement" we could get by releasing the read-side lock in retry loops would vanish in the cases where we are called within nested C.S.. E) If a library uses synchronize_rcu, this should be clearly documented, and even frowned upon, because this involves important limitations on the design of the caller, and important performance hit. There are usually ways to reach the same result through use of call_rcu, which should really be used thoroughout these libraries. F) It clearly documents when a data structure needs to use call_rcu internally. G) Some very early benchmark results show that there is indeed not much performance gain to achieve by inlining call_rcu, even if it is a version with a cache for the "call_rcu structure" lookup (per-cpu/per-thread/global). So passing it as a parameter to the data structure init function should be fine, even in cases where it is called very often. H) For use-cases where applications would like to use more than one RCU flavor concurrently (which is now supported), leaving management of RCU read-side C.S. to the reader allows the application to take more than one RCU read-side lock across API calls. It also lets the application specify its own call_rcu function that could handle more than one RCU flavor. So for all these reasons, I reverting back to the API we have in our last release (0.6.4). Signed-off-by: Mathieu Desnoyers ---