diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 42 | 
1 files changed, 23 insertions, 19 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index e9615220716..8750d4050b4 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -231,11 +231,10 @@ void tcp_select_initial_window(int __space, __u32 mss,  		/* when initializing use the value from init_rcv_wnd  		 * rather than the default from above  		 */ -		if (init_rcv_wnd && -		    (*rcv_wnd > init_rcv_wnd * mss)) -			*rcv_wnd = init_rcv_wnd * mss; -		else if (*rcv_wnd > init_cwnd * mss) -			*rcv_wnd = init_cwnd * mss; +		if (init_rcv_wnd) +			*rcv_wnd = min(*rcv_wnd, init_rcv_wnd * mss); +		else +			*rcv_wnd = min(*rcv_wnd, init_cwnd * mss);  	}  	/* Set the clamp no higher than max representable value */ @@ -386,27 +385,30 @@ struct tcp_out_options {   */  static u8 tcp_cookie_size_check(u8 desired)  { -	if (desired > 0) { +	int cookie_size; + +	if (desired > 0)  		/* previously specified */  		return desired; -	} -	if (sysctl_tcp_cookie_size <= 0) { + +	cookie_size = ACCESS_ONCE(sysctl_tcp_cookie_size); +	if (cookie_size <= 0)  		/* no default specified */  		return 0; -	} -	if (sysctl_tcp_cookie_size <= TCP_COOKIE_MIN) { + +	if (cookie_size <= TCP_COOKIE_MIN)  		/* value too small, specify minimum */  		return TCP_COOKIE_MIN; -	} -	if (sysctl_tcp_cookie_size >= TCP_COOKIE_MAX) { + +	if (cookie_size >= TCP_COOKIE_MAX)  		/* value too large, specify maximum */  		return TCP_COOKIE_MAX; -	} -	if (0x1 & sysctl_tcp_cookie_size) { + +	if (cookie_size & 1)  		/* 8-bit multiple, illegal, fix it */ -		return (u8)(sysctl_tcp_cookie_size + 0x1); -	} -	return (u8)sysctl_tcp_cookie_size; +		cookie_size++; + +	return (u8)cookie_size;  }  /* Write previously computed TCP options to the packet. @@ -1513,6 +1515,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)  	struct tcp_sock *tp = tcp_sk(sk);  	const struct inet_connection_sock *icsk = inet_csk(sk);  	u32 send_win, cong_win, limit, in_flight; +	int win_divisor;  	if (TCP_SKB_CB(skb)->flags & TCPHDR_FIN)  		goto send_now; @@ -1544,13 +1547,14 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)  	if ((skb != tcp_write_queue_tail(sk)) && (limit >= skb->len))  		goto send_now; -	if (sysctl_tcp_tso_win_divisor) { +	win_divisor = ACCESS_ONCE(sysctl_tcp_tso_win_divisor); +	if (win_divisor) {  		u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);  		/* If at least some fraction of a window is available,  		 * just use it.  		 */ -		chunk /= sysctl_tcp_tso_win_divisor; +		chunk /= win_divisor;  		if (limit >= chunk)  			goto send_now;  	} else {  |