datapath: compat: Add configure check for lockdep_rtnl_is_held()
[sliver-openvswitch.git] / datapath / linux / compat / include / linux / rtnetlink.h
1 #ifndef __RTNETLINK_WRAPPER_H
2 #define __RTNETLINK_WRAPPER_H 1
3
4 #include_next <linux/rtnetlink.h>
5
6 #ifndef HAVE_LOCKDEP_RTNL_IS_HELD
7 #ifdef CONFIG_PROVE_LOCKING
8 static inline int lockdep_rtnl_is_held(void)
9 {
10         return 1;
11 }
12 #endif
13 #endif
14
15 #ifndef rcu_dereference_rtnl
16 /**
17  * rcu_dereference_rtnl - rcu_dereference with debug checking
18  * @p: The pointer to read, prior to dereferencing
19  *
20  * Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
21  * or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference()
22  */
23 #define rcu_dereference_rtnl(p)                                 \
24         rcu_dereference_check(p, rcu_read_lock_held() ||        \
25                                  lockdep_rtnl_is_held())
26 #endif
27
28 #ifndef rtnl_dereference
29 /**
30  * rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL
31  * @p: The pointer to read, prior to dereferencing
32  *
33  * Return the value of the specified RCU-protected pointer, but omit
34  * both the smp_read_barrier_depends() and the ACCESS_ONCE(), because
35  * caller holds RTNL.
36  */
37 #define rtnl_dereference(p)                                     \
38         rcu_dereference_protected(p, lockdep_rtnl_is_held())
39 #endif
40
41 #endif /* linux/rtnetlink.h wrapper */