Commit c49956be authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Neeraj Upadhyay (AMD)

doc: Mention address and data dependencies in rcu_dereference.rst

This commit adds discussion of address and data dependencies to the
beginning of rcu_dereference.rst in order to enable readers to more
easily make the connection to the Linux-kernel memory model in general
and to memory-barriers.txt in particular.
Reported-by: default avatarJonas Oberhauser <jonas.oberhauser@huaweicloud.com>
Reported-by: default avatarAkira Yokosawa <akiyks@gmail.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Signed-off-by: default avatarNeeraj Upadhyay (AMD) <neeraj.iitr10@gmail.com>
parent 1b7178b2
...@@ -3,13 +3,26 @@ ...@@ -3,13 +3,26 @@
PROPER CARE AND FEEDING OF RETURN VALUES FROM rcu_dereference() PROPER CARE AND FEEDING OF RETURN VALUES FROM rcu_dereference()
=============================================================== ===============================================================
Most of the time, you can use values from rcu_dereference() or one of Proper care and feeding of address and data dependencies is critically
the similar primitives without worries. Dereferencing (prefix "*"), important to correct use of things like RCU. To this end, the pointers
field selection ("->"), assignment ("="), address-of ("&"), addition and returned from the rcu_dereference() family of primitives carry address and
subtraction of constants, and casts all work quite naturally and safely. data dependencies. These dependencies extend from the rcu_dereference()
macro's load of the pointer to the later use of that pointer to compute
It is nevertheless possible to get into trouble with other operations. either the address of a later memory access (representing an address
Follow these rules to keep your RCU code working properly: dependency) or the value written by a later memory access (representing
a data dependency).
Most of the time, these dependencies are preserved, permitting you to
freely use values from rcu_dereference(). For example, dereferencing
(prefix "*"), field selection ("->"), assignment ("="), address-of
("&"), casts, and addition or subtraction of constants all work quite
naturally and safely. However, because current compilers do not take
either address or data dependencies into account it is still possible
to get into trouble.
Follow these rules to preserve the address and data dependencies emanating
from your calls to rcu_dereference() and friends, thus keeping your RCU
readers working properly:
- You must use one of the rcu_dereference() family of primitives - You must use one of the rcu_dereference() family of primitives
to load an RCU-protected pointer, otherwise CONFIG_PROVE_RCU to load an RCU-protected pointer, otherwise CONFIG_PROVE_RCU
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment