diff options
Diffstat (limited to 'net/ipv4/tcp_timer.c')
| -rw-r--r-- | net/ipv4/tcp_timer.c | 30 | 
1 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 20cf4a98c69d..50bba370486e 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -143,7 +143,7 @@ static int tcp_out_of_resources(struct sock *sk, bool do_reset)   */  static int tcp_orphan_retries(struct sock *sk, bool alive)  { -	int retries = sock_net(sk)->ipv4.sysctl_tcp_orphan_retries; /* May be zero. */ +	int retries = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_orphan_retries); /* May be zero. */  	/* We know from an ICMP that something is wrong. */  	if (sk->sk_err_soft && !alive) @@ -163,7 +163,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk)  	int mss;  	/* Black hole detection */ -	if (!net->ipv4.sysctl_tcp_mtu_probing) +	if (!READ_ONCE(net->ipv4.sysctl_tcp_mtu_probing))  		return;  	if (!icsk->icsk_mtup.enabled) { @@ -171,9 +171,9 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk)  		icsk->icsk_mtup.probe_timestamp = tcp_jiffies32;  	} else {  		mss = tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low) >> 1; -		mss = min(net->ipv4.sysctl_tcp_base_mss, mss); -		mss = max(mss, net->ipv4.sysctl_tcp_mtu_probe_floor); -		mss = max(mss, net->ipv4.sysctl_tcp_min_snd_mss); +		mss = min(READ_ONCE(net->ipv4.sysctl_tcp_base_mss), mss); +		mss = max(mss, READ_ONCE(net->ipv4.sysctl_tcp_mtu_probe_floor)); +		mss = max(mss, READ_ONCE(net->ipv4.sysctl_tcp_min_snd_mss));  		icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, mss);  	}  	tcp_sync_mss(sk, icsk->icsk_pmtu_cookie); @@ -239,17 +239,18 @@ static int tcp_write_timeout(struct sock *sk)  	if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {  		if (icsk->icsk_retransmits)  			__dst_negative_advice(sk); -		retry_until = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; +		retry_until = icsk->icsk_syn_retries ? : +			READ_ONCE(net->ipv4.sysctl_tcp_syn_retries);  		expired = icsk->icsk_retransmits >= retry_until;  	} else { -		if (retransmits_timed_out(sk, net->ipv4.sysctl_tcp_retries1, 0)) { +		if (retransmits_timed_out(sk, READ_ONCE(net->ipv4.sysctl_tcp_retries1), 0)) {  			/* Black hole detection */  			tcp_mtu_probing(icsk, sk);  			__dst_negative_advice(sk);  		} -		retry_until = net->ipv4.sysctl_tcp_retries2; +		retry_until = READ_ONCE(net->ipv4.sysctl_tcp_retries2);  		if (sock_flag(sk, SOCK_DEAD)) {  			const bool alive = icsk->icsk_rto < TCP_RTO_MAX; @@ -380,7 +381,7 @@ static void tcp_probe_timer(struct sock *sk)  		 msecs_to_jiffies(icsk->icsk_user_timeout))  		goto abort; -	max_probes = sock_net(sk)->ipv4.sysctl_tcp_retries2; +	max_probes = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_retries2);  	if (sock_flag(sk, SOCK_DEAD)) {  		const bool alive = inet_csk_rto_backoff(icsk, TCP_RTO_MAX) < TCP_RTO_MAX; @@ -406,12 +407,15 @@ abort:		tcp_write_err(sk);  static void tcp_fastopen_synack_timer(struct sock *sk, struct request_sock *req)  {  	struct inet_connection_sock *icsk = inet_csk(sk); -	int max_retries = icsk->icsk_syn_retries ? : -	    sock_net(sk)->ipv4.sysctl_tcp_synack_retries + 1; /* add one more retry for fastopen */  	struct tcp_sock *tp = tcp_sk(sk); +	int max_retries;  	req->rsk_ops->syn_ack_timeout(req); +	/* add one more retry for fastopen */ +	max_retries = icsk->icsk_syn_retries ? : +		READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_synack_retries) + 1; +  	if (req->num_timeout >= max_retries) {  		tcp_write_err(sk);  		return; @@ -574,7 +578,7 @@ out_reset_timer:  	 * linear-timeout retransmissions into a black hole  	 */  	if (sk->sk_state == TCP_ESTABLISHED && -	    (tp->thin_lto || net->ipv4.sysctl_tcp_thin_linear_timeouts) && +	    (tp->thin_lto || READ_ONCE(net->ipv4.sysctl_tcp_thin_linear_timeouts)) &&  	    tcp_stream_is_thin(tp) &&  	    icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) {  		icsk->icsk_backoff = 0; @@ -585,7 +589,7 @@ out_reset_timer:  	}  	inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,  				  tcp_clamp_rto_to_user_timeout(sk), TCP_RTO_MAX); -	if (retransmits_timed_out(sk, net->ipv4.sysctl_tcp_retries1 + 1, 0)) +	if (retransmits_timed_out(sk, READ_ONCE(net->ipv4.sysctl_tcp_retries1) + 1, 0))  		__sk_dst_reset(sk);  out:;  | 
