diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 889c89362bfc..b39f0d86e44c 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2651,6 +2651,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, | |||
2651 | u32 cnt = 0; | 2651 | u32 cnt = 0; |
2652 | u32 reord = tp->packets_out; | 2652 | u32 reord = tp->packets_out; |
2653 | s32 seq_rtt = -1; | 2653 | s32 seq_rtt = -1; |
2654 | s32 ca_seq_rtt = -1; | ||
2654 | ktime_t last_ackt = net_invalid_timestamp(); | 2655 | ktime_t last_ackt = net_invalid_timestamp(); |
2655 | 2656 | ||
2656 | while ((skb = tcp_write_queue_head(sk)) && skb != tcp_send_head(sk)) { | 2657 | while ((skb = tcp_write_queue_head(sk)) && skb != tcp_send_head(sk)) { |
@@ -2659,6 +2660,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, | |||
2659 | u32 packets_acked; | 2660 | u32 packets_acked; |
2660 | u8 sacked = scb->sacked; | 2661 | u8 sacked = scb->sacked; |
2661 | 2662 | ||
2663 | /* Determine how many packets and what bytes were acked, tso and else */ | ||
2662 | if (after(scb->end_seq, tp->snd_una)) { | 2664 | if (after(scb->end_seq, tp->snd_una)) { |
2663 | if (tcp_skb_pcount(skb) == 1 || | 2665 | if (tcp_skb_pcount(skb) == 1 || |
2664 | !after(tp->snd_una, scb->seq)) | 2666 | !after(tp->snd_una, scb->seq)) |
@@ -2686,15 +2688,16 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, | |||
2686 | if (sacked & TCPCB_SACKED_RETRANS) | 2688 | if (sacked & TCPCB_SACKED_RETRANS) |
2687 | tp->retrans_out -= packets_acked; | 2689 | tp->retrans_out -= packets_acked; |
2688 | flag |= FLAG_RETRANS_DATA_ACKED; | 2690 | flag |= FLAG_RETRANS_DATA_ACKED; |
2691 | ca_seq_rtt = -1; | ||
2689 | seq_rtt = -1; | 2692 | seq_rtt = -1; |
2690 | if ((flag & FLAG_DATA_ACKED) || | 2693 | if ((flag & FLAG_DATA_ACKED) || |
2691 | (packets_acked > 1)) | 2694 | (packets_acked > 1)) |
2692 | flag |= FLAG_NONHEAD_RETRANS_ACKED; | 2695 | flag |= FLAG_NONHEAD_RETRANS_ACKED; |
2693 | } else { | 2696 | } else { |
2697 | ca_seq_rtt = now - scb->when; | ||
2698 | last_ackt = skb->tstamp; | ||
2694 | if (seq_rtt < 0) { | 2699 | if (seq_rtt < 0) { |
2695 | seq_rtt = now - scb->when; | 2700 | seq_rtt = ca_seq_rtt; |
2696 | if (fully_acked) | ||
2697 | last_ackt = skb->tstamp; | ||
2698 | } | 2701 | } |
2699 | if (!(sacked & TCPCB_SACKED_ACKED)) | 2702 | if (!(sacked & TCPCB_SACKED_ACKED)) |
2700 | reord = min(cnt, reord); | 2703 | reord = min(cnt, reord); |
@@ -2709,10 +2712,10 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, | |||
2709 | !before(end_seq, tp->snd_up)) | 2712 | !before(end_seq, tp->snd_up)) |
2710 | tp->urg_mode = 0; | 2713 | tp->urg_mode = 0; |
2711 | } else { | 2714 | } else { |
2715 | ca_seq_rtt = now - scb->when; | ||
2716 | last_ackt = skb->tstamp; | ||
2712 | if (seq_rtt < 0) { | 2717 | if (seq_rtt < 0) { |
2713 | seq_rtt = now - scb->when; | 2718 | seq_rtt = ca_seq_rtt; |
2714 | if (fully_acked) | ||
2715 | last_ackt = skb->tstamp; | ||
2716 | } | 2719 | } |
2717 | reord = min(cnt, reord); | 2720 | reord = min(cnt, reord); |
2718 | } | 2721 | } |
@@ -2772,8 +2775,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, s32 *seq_rtt_p, | |||
2772 | net_invalid_timestamp())) | 2775 | net_invalid_timestamp())) |
2773 | rtt_us = ktime_us_delta(ktime_get_real(), | 2776 | rtt_us = ktime_us_delta(ktime_get_real(), |
2774 | last_ackt); | 2777 | last_ackt); |
2775 | else if (seq_rtt > 0) | 2778 | else if (ca_seq_rtt > 0) |
2776 | rtt_us = jiffies_to_usecs(seq_rtt); | 2779 | rtt_us = jiffies_to_usecs(ca_seq_rtt); |
2777 | } | 2780 | } |
2778 | 2781 | ||
2779 | ca_ops->pkts_acked(sk, pkts_acked, rtt_us); | 2782 | ca_ops->pkts_acked(sk, pkts_acked, rtt_us); |