diff options
| -rw-r--r-- | include/net/sock.h | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/include/net/sock.h b/include/net/sock.h index 2fc513aa114c..7a7058f4f265 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1934,7 +1934,8 @@ static inline u32 net_tx_rndhash(void)  static inline void sk_set_txhash(struct sock *sk)  { -	sk->sk_txhash = net_tx_rndhash(); +	/* This pairs with READ_ONCE() in skb_set_hash_from_sk() */ +	WRITE_ONCE(sk->sk_txhash, net_tx_rndhash());  }  static inline bool sk_rethink_txhash(struct sock *sk) @@ -2206,9 +2207,12 @@ static inline void sock_poll_wait(struct file *filp, struct socket *sock,  static inline void skb_set_hash_from_sk(struct sk_buff *skb, struct sock *sk)  { -	if (sk->sk_txhash) { +	/* This pairs with WRITE_ONCE() in sk_set_txhash() */ +	u32 txhash = READ_ONCE(sk->sk_txhash); + +	if (txhash) {  		skb->l4_hash = 1; -		skb->hash = sk->sk_txhash; +		skb->hash = txhash;  	}  } | 
