diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 21 | 
1 files changed, 12 insertions, 9 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 65cf90e063d5..eeaac399420d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -671,6 +671,7 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)  {  	struct tcp_sock *tp = tcp_sk(sk);  	long m = mrtt; /* RTT */ +	u32 srtt = tp->srtt;  	/*	The following amusing code comes from Jacobson's  	 *	article in SIGCOMM '88.  Note that rtt and mdev @@ -688,11 +689,9 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)  	 * does not matter how to _calculate_ it. Seems, it was trap  	 * that VJ failed to avoid. 8)  	 */ -	if (m == 0) -		m = 1; -	if (tp->srtt != 0) { -		m -= (tp->srtt >> 3);	/* m is now error in rtt est */ -		tp->srtt += m;		/* rtt = 7/8 rtt + 1/8 new */ +	if (srtt != 0) { +		m -= (srtt >> 3);	/* m is now error in rtt est */ +		srtt += m;		/* rtt = 7/8 rtt + 1/8 new */  		if (m < 0) {  			m = -m;		/* m is now abs(error) */  			m -= (tp->mdev >> 2);   /* similar update on mdev */ @@ -723,11 +722,12 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)  		}  	} else {  		/* no previous measure. */ -		tp->srtt = m << 3;	/* take the measured time to be rtt */ +		srtt = m << 3;		/* take the measured time to be rtt */  		tp->mdev = m << 1;	/* make sure rto = 3*rtt */  		tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));  		tp->rtt_seq = tp->snd_nxt;  	} +	tp->srtt = max(1U, srtt);  }  /* Set the sk_pacing_rate to allow proper sizing of TSO packets. @@ -746,8 +746,10 @@ static void tcp_update_pacing_rate(struct sock *sk)  	rate *= max(tp->snd_cwnd, tp->packets_out); -	/* Correction for small srtt : minimum srtt being 8 (1 jiffy << 3), -	 * be conservative and assume srtt = 1 (125 us instead of 1.25 ms) +	/* Correction for small srtt and scheduling constraints. +	 * For small rtt, consider noise is too high, and use +	 * the minimal value (srtt = 1 -> 125 us for HZ=1000) +	 *  	 * We probably need usec resolution in the future.  	 * Note: This also takes care of possible srtt=0 case,  	 * when tcp_rtt_estimator() was not yet called. @@ -1943,8 +1945,9 @@ void tcp_enter_loss(struct sock *sk, int how)  		if (skb == tcp_send_head(sk))  			break; -		if (TCP_SKB_CB(skb)->sacked & TCPCB_RETRANS) +		if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS)  			tp->undo_marker = 0; +  		TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED;  		if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) {  			TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED; |