diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-09-10 19:29:02 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-10-06 14:16:18 -0400 |
commit | c3ac7cf1847a4e68c909984f60d36adef2088e35 (patch) | |
tree | 42da217639fb90fe4e453ba88c7f809a8d05572b /include/linux/rcupdate.h | |
parent | c34d2f418485a5d710bc002e490148b8ea53f456 (diff) |
rcu: Add rcu_pointer_handoff()
This commit adds an rcu_pointer_handoff() that is intended to mark
situations where a structure's protection transitions from RCU to some
other mechanism (locking, reference counting, whatever). These markings
should allow external tools to more easily spot bugs involving leaking
pointers out of RCU read-side critical sections.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'include/linux/rcupdate.h')
-rw-r--r-- | include/linux/rcupdate.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 6c3ceceb6148..587eb057e2fa 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -813,6 +813,28 @@ static inline void rcu_preempt_sleep_check(void) | |||
813 | #define rcu_dereference_sched(p) rcu_dereference_sched_check(p, 0) | 813 | #define rcu_dereference_sched(p) rcu_dereference_sched_check(p, 0) |
814 | 814 | ||
815 | /** | 815 | /** |
816 | * rcu_pointer_handoff() - Hand off a pointer from RCU to other mechanism | ||
817 | * @p: The pointer to hand off | ||
818 | * | ||
819 | * This is simply an identity function, but it documents where a pointer | ||
820 | * is handed off from RCU to some other synchronization mechanism, for | ||
821 | * example, reference counting or locking. In C11, it would map to | ||
822 | * kill_dependency(). It could be used as follows: | ||
823 | * | ||
824 | * rcu_read_lock(); | ||
825 | * p = rcu_dereference(gp); | ||
826 | * long_lived = is_long_lived(p); | ||
827 | * if (long_lived) { | ||
828 | * if (!atomic_inc_not_zero(p->refcnt)) | ||
829 | * long_lived = false; | ||
830 | * else | ||
831 | * p = rcu_pointer_handoff(p); | ||
832 | * } | ||
833 | * rcu_read_unlock(); | ||
834 | */ | ||
835 | #define rcu_pointer_handoff(p) (p) | ||
836 | |||
837 | /** | ||
816 | * rcu_read_lock() - mark the beginning of an RCU read-side critical section | 838 | * rcu_read_lock() - mark the beginning of an RCU read-side critical section |
817 | * | 839 | * |
818 | * When synchronize_rcu() is invoked on one CPU while other CPUs | 840 | * When synchronize_rcu() is invoked on one CPU while other CPUs |