Commit c76a0328 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: annotate data-race around sk->sk_txrehash



sk_getsockopt() runs locklessly. This means sk->sk_txrehash
can be read while other threads are changing its value.

Other locations were handled in commit cb6cd2ce
("tcp: Change SYN ACK retransmit behaviour to account for rehash")

Fixes: 26859240 ("txhash: Add socket option to control TX hash rethink behavior")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Cc: Akhmat Karakotov <hmukos@yandex-team.ru>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fe11fdcb
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -1534,7 +1534,9 @@ int sk_setsockopt(struct sock *sk, int level, int optname,
		}
		}
		if ((u8)val == SOCK_TXREHASH_DEFAULT)
		if ((u8)val == SOCK_TXREHASH_DEFAULT)
			val = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);
			val = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);
		/* Paired with READ_ONCE() in tcp_rtx_synack() */
		/* Paired with READ_ONCE() in tcp_rtx_synack()
		 * and sk_getsockopt().
		 */
		WRITE_ONCE(sk->sk_txrehash, (u8)val);
		WRITE_ONCE(sk->sk_txrehash, (u8)val);
		break;
		break;


@@ -1978,7 +1980,8 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
		break;
		break;


	case SO_TXREHASH:
	case SO_TXREHASH:
		v.val = sk->sk_txrehash;
		/* Paired with WRITE_ONCE() in sk_setsockopt() */
		v.val = READ_ONCE(sk->sk_txrehash);
		break;
		break;


	default:
	default: