diff options
| -rw-r--r-- | net/ipv4/tcp_input.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 85308b90df80..6e38c6c23caa 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -2926,13 +2926,14 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) | |||
| 2926 | * tcp_xmit_retransmit_queue(). | 2926 | * tcp_xmit_retransmit_queue(). |
| 2927 | */ | 2927 | */ |
| 2928 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | 2928 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, |
| 2929 | int newly_acked_sacked, bool is_dupack, | 2929 | int prior_sacked, bool is_dupack, |
| 2930 | int flag) | 2930 | int flag) |
| 2931 | { | 2931 | { |
| 2932 | struct inet_connection_sock *icsk = inet_csk(sk); | 2932 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2933 | struct tcp_sock *tp = tcp_sk(sk); | 2933 | struct tcp_sock *tp = tcp_sk(sk); |
| 2934 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && | 2934 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && |
| 2935 | (tcp_fackets_out(tp) > tp->reordering)); | 2935 | (tcp_fackets_out(tp) > tp->reordering)); |
| 2936 | int newly_acked_sacked = 0; | ||
| 2936 | int fast_rexmit = 0; | 2937 | int fast_rexmit = 0; |
| 2937 | 2938 | ||
| 2938 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) | 2939 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) |
| @@ -2992,6 +2993,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 2992 | tcp_add_reno_sack(sk); | 2993 | tcp_add_reno_sack(sk); |
| 2993 | } else | 2994 | } else |
| 2994 | do_lost = tcp_try_undo_partial(sk, pkts_acked); | 2995 | do_lost = tcp_try_undo_partial(sk, pkts_acked); |
| 2996 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | ||
| 2995 | break; | 2997 | break; |
| 2996 | case TCP_CA_Loss: | 2998 | case TCP_CA_Loss: |
| 2997 | if (flag & FLAG_DATA_ACKED) | 2999 | if (flag & FLAG_DATA_ACKED) |
| @@ -3013,6 +3015,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 3013 | if (is_dupack) | 3015 | if (is_dupack) |
| 3014 | tcp_add_reno_sack(sk); | 3016 | tcp_add_reno_sack(sk); |
| 3015 | } | 3017 | } |
| 3018 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | ||
| 3016 | 3019 | ||
| 3017 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) | 3020 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) |
| 3018 | tcp_try_undo_dsack(sk); | 3021 | tcp_try_undo_dsack(sk); |
| @@ -3590,7 +3593,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3590 | int prior_packets; | 3593 | int prior_packets; |
| 3591 | int prior_sacked = tp->sacked_out; | 3594 | int prior_sacked = tp->sacked_out; |
| 3592 | int pkts_acked = 0; | 3595 | int pkts_acked = 0; |
| 3593 | int newly_acked_sacked = 0; | ||
| 3594 | bool frto_cwnd = false; | 3596 | bool frto_cwnd = false; |
| 3595 | 3597 | ||
| 3596 | /* If the ack is older than previous acks | 3598 | /* If the ack is older than previous acks |
| @@ -3666,8 +3668,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3666 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); | 3668 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); |
| 3667 | 3669 | ||
| 3668 | pkts_acked = prior_packets - tp->packets_out; | 3670 | pkts_acked = prior_packets - tp->packets_out; |
| 3669 | newly_acked_sacked = (prior_packets - prior_sacked) - | ||
| 3670 | (tp->packets_out - tp->sacked_out); | ||
| 3671 | 3671 | ||
| 3672 | if (tp->frto_counter) | 3672 | if (tp->frto_counter) |
| 3673 | frto_cwnd = tcp_process_frto(sk, flag); | 3673 | frto_cwnd = tcp_process_frto(sk, flag); |
| @@ -3681,7 +3681,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3681 | tcp_may_raise_cwnd(sk, flag)) | 3681 | tcp_may_raise_cwnd(sk, flag)) |
| 3682 | tcp_cong_avoid(sk, ack, prior_in_flight); | 3682 | tcp_cong_avoid(sk, ack, prior_in_flight); |
| 3683 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); | 3683 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); |
| 3684 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | 3684 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3685 | is_dupack, flag); | 3685 | is_dupack, flag); |
| 3686 | } else { | 3686 | } else { |
| 3687 | if ((flag & FLAG_DATA_ACKED) && !frto_cwnd) | 3687 | if ((flag & FLAG_DATA_ACKED) && !frto_cwnd) |
| @@ -3698,7 +3698,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3698 | no_queue: | 3698 | no_queue: |
| 3699 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ | 3699 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ |
| 3700 | if (flag & FLAG_DSACKING_ACK) | 3700 | if (flag & FLAG_DSACKING_ACK) |
| 3701 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | 3701 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3702 | is_dupack, flag); | 3702 | is_dupack, flag); |
| 3703 | /* If this ack opens up a zero window, clear backoff. It was | 3703 | /* If this ack opens up a zero window, clear backoff. It was |
| 3704 | * being used to time the probes, and is probably far higher than | 3704 | * being used to time the probes, and is probably far higher than |
| @@ -3718,8 +3718,7 @@ old_ack: | |||
| 3718 | */ | 3718 | */ |
| 3719 | if (TCP_SKB_CB(skb)->sacked) { | 3719 | if (TCP_SKB_CB(skb)->sacked) { |
| 3720 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); | 3720 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); |
| 3721 | newly_acked_sacked = tp->sacked_out - prior_sacked; | 3721 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3722 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | ||
| 3723 | is_dupack, flag); | 3722 | is_dupack, flag); |
| 3724 | } | 3723 | } |
| 3725 | 3724 | ||
