aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c7
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) {
2791begin_fwd: 2796begin_fwd: