Skip to content

Commit

Permalink
net: relax rtnl_dereference()
Browse files Browse the repository at this point in the history
rtnl_dereference() is used in contexts where RTNL is held, to fetch an
RCU protected pointer.

Updates to this pointer are prevented by RTNL, so we dont need
smp_read_barrier_depends() and the ACCESS_ONCE() provided in
rcu_dereference_check().

rtnl_dereference() is mainly a macro to document the locking invariant.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Oct 5, 2010
1 parent 13f5bf1 commit 29fa060
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions include/linux/rtnetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -755,20 +755,22 @@ extern int lockdep_rtnl_is_held(void);
* @p: The pointer to read, prior to dereferencing
*
* Do an rcu_dereference(p), but check caller either holds rcu_read_lock()
* or RTNL
* or RTNL. Note : Please prefer rtnl_dereference() or rcu_dereference()
*/
#define rcu_dereference_rtnl(p) \
rcu_dereference_check(p, rcu_read_lock_held() || \
lockdep_rtnl_is_held())

/**
* rtnl_dereference - rcu_dereference with debug checking
* rtnl_dereference - fetch RCU pointer when updates are prevented by RTNL
* @p: The pointer to read, prior to dereferencing
*
* Do an rcu_dereference(p), but check caller holds RTNL
* Return the value of the specified RCU-protected pointer, but omit
* both the smp_read_barrier_depends() and the ACCESS_ONCE(), because
* caller holds RTNL.
*/
#define rtnl_dereference(p) \
rcu_dereference_check(p, lockdep_rtnl_is_held())
rcu_dereference_protected(p, lockdep_rtnl_is_held())

static inline struct netdev_queue *dev_ingress_queue(struct net_device *dev)
{
Expand Down

0 comments on commit 29fa060

Please sign in to comment.