diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b1bcba0563f2..b26aa870adc0 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2753,7 +2753,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | |||
2753 | struct tcp_sock *tp = tcp_sk(sk); | 2753 | struct tcp_sock *tp = tcp_sk(sk); |
2754 | struct sk_buff *skb; | 2754 | struct sk_buff *skb; |
2755 | struct sk_buff *hole = NULL; | 2755 | struct sk_buff *hole = NULL; |
2756 | u32 last_lost; | 2756 | u32 max_segs, last_lost; |
2757 | int mib_idx; | 2757 | int mib_idx; |
2758 | int fwd_rexmitting = 0; | 2758 | int fwd_rexmitting = 0; |
2759 | 2759 | ||
@@ -2773,6 +2773,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | |||
2773 | last_lost = tp->snd_una; | 2773 | last_lost = tp->snd_una; |
2774 | } | 2774 | } |
2775 | 2775 | ||
2776 | max_segs = tcp_tso_autosize(sk, tcp_current_mss(sk)); | ||
2776 | tcp_for_write_queue_from(skb, sk) { | 2777 | tcp_for_write_queue_from(skb, sk) { |
2777 | __u8 sacked = TCP_SKB_CB(skb)->sacked; | 2778 | __u8 sacked = TCP_SKB_CB(skb)->sacked; |
2778 | int segs; | 2779 | int segs; |
@@ -2786,6 +2787,10 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | |||
2786 | segs = tp->snd_cwnd - tcp_packets_in_flight(tp); | 2787 | segs = tp->snd_cwnd - tcp_packets_in_flight(tp); |
2787 | if (segs <= 0) | 2788 | if (segs <= 0) |
2788 | return; | 2789 | return; |
2790 | /* In case tcp_shift_skb_data() have aggregated large skbs, | ||
2791 | * we need to make sure not sending too bigs TSO packets | ||
2792 | */ | ||
2793 | segs = min_t(int, segs, max_segs); | ||
2789 | 2794 | ||
2790 | if (fwd_rexmitting) { | 2795 | if (fwd_rexmitting) { |
2791 | begin_fwd: | 2796 | begin_fwd: |