Revert "tcp: invalidate rate samples during SACK reneging"
authorYves-Alexis Perez <corsac@debian.org>
Mon, 8 Jan 2018 09:58:43 +0000 (10:58 +0100)
committerYves-Alexis Perez <corsac@debian.org>
Fri, 9 Feb 2018 12:58:52 +0000 (12:58 +0000)
This reverts commit e74fe7268e7eadb2880d3842fe167131220d5616 which is
d4761754b4fb2ef8d9a1e9d121c4bec84e1fe292 upstream. Prevent changing the
tcp_sock structure, causing an ABI change.

Gbp-Pq: Topic debian
Gbp-Pq: Name revert-tcp-invalidate-rate-samples-during-SACK-reneg.patch

include/linux/tcp.h
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_rate.c

index f50b717ce6448a21cced3eae6f40d93fab3b4f76..647532b0eb0314217260ca8b3e43992fe9c066d0 100644 (file)
@@ -219,8 +219,7 @@ struct tcp_sock {
        } rack;
        u16     advmss;         /* Advertised MSS                       */
        u8      rate_app_limited:1,  /* rate_{delivered,interval_us} limited? */
-               is_sack_reneg:1,    /* in recovery from loss with SACK reneg? */
-               unused:6;
+               unused:7;
        u8      nonagle     : 4,/* Disable Nagle algorithm?             */
                thin_lto    : 1,/* Use linear timeouts for thin streams */
                thin_dupack : 1,/* Fast retransmit on first dupack      */
index caf35e062639945a6af7578e2817b67ddbae11e7..fba4fc46871d20eaf3444ff0d703ea644c203970 100644 (file)
@@ -1001,7 +1001,7 @@ void tcp_rate_skb_sent(struct sock *sk, struct sk_buff *skb);
 void tcp_rate_skb_delivered(struct sock *sk, struct sk_buff *skb,
                            struct rate_sample *rs);
 void tcp_rate_gen(struct sock *sk, u32 delivered, u32 lost,
-                 bool is_sack_reneg, struct skb_mstamp *now, struct rate_sample *rs);
+                 struct skb_mstamp *now, struct rate_sample *rs);
 void tcp_rate_check_app_limited(struct sock *sk);
 
 /* These functions determine how the current flow behaves in respect of SACK
index 7efa6b062049aae357d3ad163c5cd3103de380af..8cf5a2e2dd9b549158877e7b79388f8aa2a25620 100644 (file)
@@ -2300,7 +2300,6 @@ int tcp_disconnect(struct sock *sk, int flags)
        tp->snd_cwnd_cnt = 0;
        tp->window_clamp = 0;
        tcp_set_ca_state(sk, TCP_CA_Open);
-       tp->is_sack_reneg = 0;
        tcp_clear_retrans(tp);
        inet_csk_delack_init(sk);
        /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0
index 2f107e46355cbfe3fbf9a2bcc1baafc2bb50070d..05255a2868888f8f04b32847a4e40183a60db0c9 100644 (file)
@@ -1966,8 +1966,6 @@ void tcp_enter_loss(struct sock *sk)
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSACKRENEGING);
                tp->sacked_out = 0;
                tp->fackets_out = 0;
-               /* Mark SACK reneging until we recover from this loss event. */
-               tp->is_sack_reneg = 1;
        }
        tcp_clear_all_retrans_hints(tp);
 
@@ -2465,7 +2463,6 @@ static bool tcp_try_undo_recovery(struct sock *sk)
                return true;
        }
        tcp_set_ca_state(sk, TCP_CA_Open);
-       tp->is_sack_reneg = 0;
        return false;
 }
 
@@ -2497,10 +2494,8 @@ static bool tcp_try_undo_loss(struct sock *sk, bool frto_undo)
                        NET_INC_STATS(sock_net(sk),
                                        LINUX_MIB_TCPSPURIOUSRTOS);
                inet_csk(sk)->icsk_retransmits = 0;
-               if (frto_undo || tcp_is_sack(tp)) {
+               if (frto_undo || tcp_is_sack(tp))
                        tcp_set_ca_state(sk, TCP_CA_Open);
-                       tp->is_sack_reneg = 0;
-               }
                return true;
        }
        return false;
@@ -3594,7 +3589,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
        struct tcp_sacktag_state sack_state;
        struct rate_sample rs = { .prior_delivered = 0 };
        u32 prior_snd_una = tp->snd_una;
-       bool is_sack_reneg = tp->is_sack_reneg;
        u32 ack_seq = TCP_SKB_CB(skb)->seq;
        u32 ack = TCP_SKB_CB(skb)->ack_seq;
        bool is_dupack = false;
@@ -3717,7 +3711,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
                tcp_schedule_loss_probe(sk);
        delivered = tp->delivered - delivered;  /* freshly ACKed or SACKed */
        lost = tp->lost - lost;                 /* freshly marked lost */
-       tcp_rate_gen(sk, delivered, lost, is_sack_reneg, &now, &rs);
+       tcp_rate_gen(sk, delivered, lost, &now, &rs);
        tcp_cong_control(sk, ack, delivered, flag, &rs);
        tcp_xmit_recovery(sk, rexmit);
        return 1;
index 18309f58ab8d8056fec9d732006a6f1af281a60f..9be1581a5a08c36f4544fbdabedd9741fb266a1e 100644 (file)
@@ -106,7 +106,7 @@ void tcp_rate_skb_delivered(struct sock *sk, struct sk_buff *skb,
 
 /* Update the connection delivery information and generate a rate sample. */
 void tcp_rate_gen(struct sock *sk, u32 delivered, u32 lost,
-                 bool is_sack_reneg, struct skb_mstamp *now, struct rate_sample *rs)
+                 struct skb_mstamp *now, struct rate_sample *rs)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        u32 snd_us, ack_us;
@@ -124,12 +124,8 @@ void tcp_rate_gen(struct sock *sk, u32 delivered, u32 lost,
 
        rs->acked_sacked = delivered;   /* freshly ACKed or SACKed */
        rs->losses = lost;              /* freshly marked lost */
-       /* Return an invalid sample if no timing information is available or
-        * in recovery from loss with SACK reneging. Rate samples taken during
-        * a SACK reneging event may overestimate bw by including packets that
-        * were SACKed before the reneg.
-        */
-       if (!rs->prior_mstamp.v64 || is_sack_reneg) {
+       /* Return an invalid sample if no timing information is available. */
+       if (!rs->prior_mstamp.v64) {
                rs->delivered = -1;
                rs->interval_us = -1;
                return;