diff options
Diffstat (limited to 'include/net/dst.h')
| -rw-r--r-- | include/net/dst.h | 17 | 
1 files changed, 13 insertions, 4 deletions
| diff --git a/include/net/dst.h b/include/net/dst.h index 29e255796ce1..13d507d69ddb 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -37,7 +37,7 @@ struct dst_entry {  	unsigned long		_metrics;  	unsigned long		expires;  	struct dst_entry	*path; -	struct neighbour	*_neighbour; +	struct neighbour __rcu	*_neighbour;  #ifdef CONFIG_XFRM  	struct xfrm_state	*xfrm;  #else @@ -88,12 +88,17 @@ struct dst_entry {  static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst)  { -	return dst->_neighbour; +	return rcu_dereference(dst->_neighbour); +} + +static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst) +{ +	return rcu_dereference_raw(dst->_neighbour);  }  static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh)  { -	dst->_neighbour = neigh; +	rcu_assign_pointer(dst->_neighbour, neigh);  }  extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); @@ -382,8 +387,12 @@ static inline void dst_rcu_free(struct rcu_head *head)  static inline void dst_confirm(struct dst_entry *dst)  {  	if (dst) { -		struct neighbour *n = dst_get_neighbour(dst); +		struct neighbour *n; + +		rcu_read_lock(); +		n = dst_get_neighbour(dst);  		neigh_confirm(n); +		rcu_read_unlock();  	}  } | 
