diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 0bc9e46a5369..ae60dd3faed0 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -739,8 +739,10 @@ static void tcp_tsq_handler(struct sock *sk)  		struct tcp_sock *tp = tcp_sk(sk);  		if (tp->lost_out > tp->retrans_out && -		    tp->snd_cwnd > tcp_packets_in_flight(tp)) +		    tp->snd_cwnd > tcp_packets_in_flight(tp)) { +			tcp_mstamp_refresh(tp);  			tcp_xmit_retransmit_queue(sk); +		}  		tcp_write_xmit(sk, tcp_current_mss(sk), tp->nonagle,  			       0, GFP_ATOMIC); @@ -2237,6 +2239,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,  	sent_pkts = 0; +	tcp_mstamp_refresh(tp);  	if (!push_one) {  		/* Do MTU probing. */  		result = tcp_mtu_probe(sk); @@ -2248,7 +2251,6 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,  	}  	max_segs = tcp_tso_segs(sk, mss_now); -	tcp_mstamp_refresh(tp);  	while ((skb = tcp_send_head(sk))) {  		unsigned int limit; @@ -2841,8 +2843,10 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)  		nskb = __pskb_copy(skb, MAX_TCP_HEADER, GFP_ATOMIC);  		err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) :  			     -ENOBUFS; -		if (!err) +		if (!err) {  			skb->skb_mstamp = tp->tcp_mstamp; +			tcp_rate_skb_sent(sk, skb); +		}  	} else {  		err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);  	} | 
