diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-01-12 20:21:20 -0500 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2012-02-21 12:03:46 -0500 |
commit | 5e1ee6e1016763812018bf5c5e966992821dc47e (patch) | |
tree | f2acb5d76a39da392d1f43e5c78a5ffc1482ef71 /include/linux/rcupdate.h | |
parent | 50406b98b6372e7de21d903d2cf3914e9d64e094 (diff) |
rcu: Note that rcu_access_pointer() can be used for teardown
There is no convenient expression for rcu_deference_protected()
when it is used in tearing down multilinked structures following
a grace period. For example, suppose that an element containing an
RCU-protected pointer to a second element is removed from an enclosing
RCU-protected data structure, then the write-side lock is released,
and finally synchronize_rcu() is invoked to wait for a grace period.
Then it is necessary to traverse the pointer in order to free up the
second element. But we are not in an RCU read-side critical section
and we are holding no locks, so the usual rcu_dereference_check() and
rcu_dereference_protected() primitives are not appropriate. Neither
is rcu_dereference_raw(), as it is intended for use in data structures
where the user defines the locking design (for example, list_head).
So this responsibility is added to rcu_access_pointer()'s list, and
this commit updates rcu_assign_pointer()'s header comment accordingly.
Suggested-by: David Howells <dhowells@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r-- | include/linux/rcupdate.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 6df0ae197810..f409529ff35a 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -484,6 +484,13 @@ static inline void rcu_preempt_sleep_check(void) | |||
484 | * NULL. Although rcu_access_pointer() may also be used in cases where | 484 | * NULL. Although rcu_access_pointer() may also be used in cases where |
485 | * update-side locks prevent the value of the pointer from changing, you | 485 | * update-side locks prevent the value of the pointer from changing, you |
486 | * should instead use rcu_dereference_protected() for this use case. | 486 | * should instead use rcu_dereference_protected() for this use case. |
487 | * | ||
488 | * It is also permissible to use rcu_access_pointer() when read-side | ||
489 | * access to the pointer was removed at least one grace period ago, as | ||
490 | * is the case in the context of the RCU callback that is freeing up | ||
491 | * the data, or after a synchronize_rcu() returns. This can be useful | ||
492 | * when tearing down multi-linked structures after a grace period | ||
493 | * has elapsed. | ||
487 | */ | 494 | */ |
488 | #define rcu_access_pointer(p) __rcu_access_pointer((p), __rcu) | 495 | #define rcu_access_pointer(p) __rcu_access_pointer((p), __rcu) |
489 | 496 | ||