diff options
Diffstat (limited to 'net/ipv4/tcp_timer.c')
| -rw-r--r-- | net/ipv4/tcp_timer.c | 22 | 
1 files changed, 12 insertions, 10 deletions
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 676020663ce8..f87dbc78b6bc 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -40,15 +40,17 @@ static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk)  {  	struct inet_connection_sock *icsk = inet_csk(sk);  	u32 elapsed, start_ts; +	s32 remaining;  	start_ts = tcp_retransmit_stamp(sk);  	if (!icsk->icsk_user_timeout || !start_ts)  		return icsk->icsk_rto;  	elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts; -	if (elapsed >= icsk->icsk_user_timeout) +	remaining = icsk->icsk_user_timeout - elapsed; +	if (remaining <= 0)  		return 1; /* user timeout has passed; fire ASAP */ -	else -		return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - elapsed)); + +	return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(remaining));  }  /** @@ -209,7 +211,7 @@ static bool retransmits_timed_out(struct sock *sk,  				(boundary - linear_backoff_thresh) * TCP_RTO_MAX;  		timeout = jiffies_to_msecs(timeout);  	} -	return (tcp_time_stamp(tcp_sk(sk)) - start_ts) >= timeout; +	return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0;  }  /* A write timeout has occurred. Process the after effects. */ @@ -376,7 +378,7 @@ static void tcp_probe_timer(struct sock *sk)  			return;  	} -	if (icsk->icsk_probes_out > max_probes) { +	if (icsk->icsk_probes_out >= max_probes) {  abort:		tcp_write_err(sk);  	} else {  		/* Only send another probe if we didn't close things up. */ @@ -482,11 +484,12 @@ void tcp_retransmit_timer(struct sock *sk)  		goto out_reset_timer;  	} +	__NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPTIMEOUTS);  	if (tcp_write_timeout(sk))  		goto out;  	if (icsk->icsk_retransmits == 0) { -		int mib_idx; +		int mib_idx = 0;  		if (icsk->icsk_ca_state == TCP_CA_Recovery) {  			if (tcp_is_sack(tp)) @@ -501,10 +504,9 @@ void tcp_retransmit_timer(struct sock *sk)  				mib_idx = LINUX_MIB_TCPSACKFAILURES;  			else  				mib_idx = LINUX_MIB_TCPRENOFAILURES; -		} else { -			mib_idx = LINUX_MIB_TCPTIMEOUTS;  		} -		__NET_INC_STATS(sock_net(sk), mib_idx); +		if (mib_idx) +			__NET_INC_STATS(sock_net(sk), mib_idx);  	}  	tcp_enter_loss(sk); @@ -740,7 +742,7 @@ static enum hrtimer_restart tcp_compressed_ack_kick(struct hrtimer *timer)  	bh_lock_sock(sk);  	if (!sock_owned_by_user(sk)) { -		if (tp->compressed_ack) +		if (tp->compressed_ack > TCP_FASTRETRANS_THRESH)  			tcp_send_ack(sk);  	} else {  		if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED,  | 
