* [PATCH net-next 0/3] tcp: remove obsolete RFC3517/RFC6675 code
@ 2025-06-13 23:09 Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Neal Cardwell @ 2025-06-13 23:09 UTC (permalink / raw)
To: David Miller, Jakub Kicinski, Eric Dumazet; +Cc: netdev, Neal Cardwell
From: Neal Cardwell <ncardwell@google.com>
RACK-TLP loss detection has been enabled as the default loss detection
algorithm for Linux TCP since 2018, in:
commit b38a51fec1c1 ("tcp: disable RFC6675 loss detection")
In case users ran into unexpected bugs or performance regressions,
that commit allowed Linux system administrators to revert to using
RFC3517/RFC6675 loss recovery by setting net.ipv4.tcp_recovery to 0.
In the seven years since 2018, our team has not heard reports of
anyone reverting Linux TCP to use RFC3517/RFC6675 loss recovery, and
we can't find any record in web searches of such a revert.
RACK-TLP was published as a standards-track RFC, RFC8985, in February
2021.
Several other major TCP implementations have default-enabled RACK-TLP
at this point as well.
RACK-TLP offers several significant performance advantages over
RFC3517/RFC6675 loss recovery, including much better performance in
the common cases of tail drops, lost retransmissions, and reordering.
It is now time to remove the obsolete and unused RFC3517/RFC6675 loss
recovery code. This will allow a substantial simplification of the
Linux TCP code base, and removes 12 bytes of state in every tcp_sock
for 64-bit machines (8 bytes on 32-bit machines).
To arrange the commits in reasonable sizes, this patch series is split
into 3 commits:
(1) Removes the core RFC3517/RFC6675 logic.
(2) Removes the RFC3517/RFC6675 hint state and the first layer of logic that
updates that state.
(3) Removes the emptied-out tcp_clear_retrans_hints_partial() helper function
and all of its call sites.
Neal Cardwell (3):
tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint
tcp: remove RFC3517/RFC6675 tcp_clear_retrans_hints_partial()
Documentation/networking/ip-sysctl.rst | 8 +-
.../networking/net_cachelines/tcp_sock.rst | 2 -
include/linux/tcp.h | 3 -
include/net/tcp.h | 6 -
net/ipv4/tcp.c | 3 +-
net/ipv4/tcp_input.c | 151 ++----------------
net/ipv4/tcp_output.c | 6 -
7 files changed, 15 insertions(+), 164 deletions(-)
--
2.50.0.rc1.591.g9c95f17f64-goog
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
2025-06-13 23:09 [PATCH net-next 0/3] tcp: remove obsolete RFC3517/RFC6675 code Neal Cardwell
@ 2025-06-13 23:09 ` Neal Cardwell
2025-06-14 20:07 ` Jakub Kicinski
2025-06-14 22:03 ` kernel test robot
2025-06-13 23:09 ` [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 3/3] tcp: remove RFC3517/RFC6675 tcp_clear_retrans_hints_partial() Neal Cardwell
2 siblings, 2 replies; 8+ messages in thread
From: Neal Cardwell @ 2025-06-13 23:09 UTC (permalink / raw)
To: David Miller, Jakub Kicinski, Eric Dumazet
Cc: netdev, Neal Cardwell, Yuchung Cheng
From: Neal Cardwell <ncardwell@google.com>
RACK-TLP loss detection has been enabled as the default loss detection
algorithm for Linux TCP since 2018, in:
commit b38a51fec1c1 ("tcp: disable RFC6675 loss detection")
In case users ran into unexpected bugs or performance regressions,
that commit allowed Linux system administrators to revert to using
RFC3517/RFC6675 loss recovery by setting net.ipv4.tcp_recovery to 0.
In the seven years since 2018, our team has not heard reports of
anyone reverting Linux TCP to use RFC3517/RFC6675 loss recovery, and
we can't find any record in web searches of such a revert.
RACK-TLP was published as a standards-track RFC, RFC8985, in February
2021.
Several other major TCP implementations have default-enabled RACK-TLP
at this point as well.
RACK-TLP offers several significant performance advantages over
RFC3517/RFC6675 loss recovery, including much better performance in
the common cases of tail drops, lost retransmissions, and reordering.
It is now time to remove the obsolete and unused RFC3517/RFC6675 loss
recovery code. This will allow a substantial simplification of the
Linux TCP code base, and removes 12 bytes of state in every tcp_sock
for 64-bit machines (8 bytes on 32-bit machines).
To arrange the commits in reasonable sizes, this patch series is split
into 3 commits. The following 2 commits remove bookkeeping state and
code that is no longer needed after this removal of RFC3517/RFC6675
loss recovery.
Suggested-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Yuchung Cheng <ycheng@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
---
Documentation/networking/ip-sysctl.rst | 8 +-
net/ipv4/tcp_input.c | 134 ++-----------------------
2 files changed, 14 insertions(+), 128 deletions(-)
diff --git a/Documentation/networking/ip-sysctl.rst b/Documentation/networking/ip-sysctl.rst
index 0f1251cce3149..b31c055f576fa 100644
--- a/Documentation/networking/ip-sysctl.rst
+++ b/Documentation/networking/ip-sysctl.rst
@@ -645,9 +645,11 @@ tcp_recovery - INTEGER
features.
========= =============================================================
- RACK: 0x1 enables the RACK loss detection for fast detection of lost
- retransmissions and tail drops. It also subsumes and disables
- RFC6675 recovery for SACK connections.
+ RACK: 0x1 enables RACK loss detection, for fast detection of lost
+ retransmissions and tail drops, and resilience to
+ reordering. currrently, setting this bit to 0 has no
+ effect, since RACK is the only supported loss detection
+ algorithm.
RACK: 0x2 makes RACK's reordering window static (min_rtt/4).
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 8ec92dec321a9..b52eaa45e652f 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2151,12 +2151,6 @@ static inline void tcp_init_undo(struct tcp_sock *tp)
tp->undo_retrans = -1;
}
-static bool tcp_is_rack(const struct sock *sk)
-{
- return READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_recovery) &
- TCP_RACK_LOSS_DETECTION;
-}
-
/* If we detect SACK reneging, forget all SACK information
* and reset tags completely, otherwise preserve SACKs. If receiver
* dropped its ofo queue, we will know this due to reneging detection.
@@ -2182,8 +2176,7 @@ static void tcp_timeout_mark_lost(struct sock *sk)
skb_rbtree_walk_from(skb) {
if (is_reneg)
TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED;
- else if (tcp_is_rack(sk) && skb != head &&
- tcp_rack_skb_timeout(tp, skb, 0) > 0)
+ else if (skb != head && tcp_rack_skb_timeout(tp, skb, 0) > 0)
continue; /* Don't mark recently sent ones lost yet */
tcp_mark_skb_lost(sk, skb);
}
@@ -2264,22 +2257,6 @@ static bool tcp_check_sack_reneging(struct sock *sk, int *ack_flag)
return false;
}
-/* Heurestics to calculate number of duplicate ACKs. There's no dupACKs
- * counter when SACK is enabled (without SACK, sacked_out is used for
- * that purpose).
- *
- * With reordering, holes may still be in flight, so RFC3517 recovery
- * uses pure sacked_out (total number of SACKed segments) even though
- * it violates the RFC that uses duplicate ACKs, often these are equal
- * but when e.g. out-of-window ACKs or packet duplication occurs,
- * they differ. Since neither occurs due to loss, TCP should really
- * ignore them.
- */
-static inline int tcp_dupack_heuristics(const struct tcp_sock *tp)
-{
- return tp->sacked_out + 1;
-}
-
/* Linux NewReno/SACK/ECN state machine.
* --------------------------------------
*
@@ -2332,13 +2309,7 @@ static inline int tcp_dupack_heuristics(const struct tcp_sock *tp)
*
* If the receiver supports SACK:
*
- * RFC6675/3517: It is the conventional algorithm. A packet is
- * considered lost if the number of higher sequence packets
- * SACKed is greater than or equal the DUPACK thoreshold
- * (reordering). This is implemented in tcp_mark_head_lost and
- * tcp_update_scoreboard.
- *
- * RACK (draft-ietf-tcpm-rack-01): it is a newer algorithm
+ * RACK (RFC8985): RACK is a newer loss detection algorithm
* (2017-) that checks timing instead of counting DUPACKs.
* Essentially a packet is considered lost if it's not S/ACKed
* after RTT + reordering_window, where both metrics are
@@ -2353,8 +2324,8 @@ static inline int tcp_dupack_heuristics(const struct tcp_sock *tp)
* is lost (NewReno). This heuristics are the same in NewReno
* and SACK.
*
- * Really tricky (and requiring careful tuning) part of algorithm
- * is hidden in functions tcp_time_to_recover() and tcp_xmit_retransmit_queue().
+ * The really tricky (and requiring careful tuning) part of the algorithm
+ * is hidden in the RACK code in tcp_recovery.c and tcp_xmit_retransmit_queue().
* The first determines the moment _when_ we should reduce CWND and,
* hence, slow down forward transmission. In fact, it determines the moment
* when we decide that hole is caused by loss, rather than by a reorder.
@@ -2381,79 +2352,8 @@ static bool tcp_time_to_recover(struct sock *sk, int flag)
{
struct tcp_sock *tp = tcp_sk(sk);
- /* Trick#1: The loss is proven. */
- if (tp->lost_out)
- return true;
-
- /* Not-A-Trick#2 : Classic rule... */
- if (!tcp_is_rack(sk) && tcp_dupack_heuristics(tp) > tp->reordering)
- return true;
-
- return false;
-}
-
-/* Detect loss in event "A" above by marking head of queue up as lost.
- * For RFC3517 SACK, a segment is considered lost if it
- * has at least tp->reordering SACKed seqments above it; "packets" refers to
- * the maximum SACKed segments to pass before reaching this limit.
- */
-static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head)
-{
- struct tcp_sock *tp = tcp_sk(sk);
- struct sk_buff *skb;
- int cnt;
- /* Use SACK to deduce losses of new sequences sent during recovery */
- const u32 loss_high = tp->snd_nxt;
-
- WARN_ON(packets > tp->packets_out);
- skb = tp->lost_skb_hint;
- if (skb) {
- /* Head already handled? */
- if (mark_head && after(TCP_SKB_CB(skb)->seq, tp->snd_una))
- return;
- cnt = tp->lost_cnt_hint;
- } else {
- skb = tcp_rtx_queue_head(sk);
- cnt = 0;
- }
-
- skb_rbtree_walk_from(skb) {
- /* TODO: do this better */
- /* this is not the most efficient way to do this... */
- tp->lost_skb_hint = skb;
- tp->lost_cnt_hint = cnt;
-
- if (after(TCP_SKB_CB(skb)->end_seq, loss_high))
- break;
-
- if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)
- cnt += tcp_skb_pcount(skb);
-
- if (cnt > packets)
- break;
-
- if (!(TCP_SKB_CB(skb)->sacked & TCPCB_LOST))
- tcp_mark_skb_lost(sk, skb);
-
- if (mark_head)
- break;
- }
- tcp_verify_left_out(tp);
-}
-
-/* Account newly detected lost packet(s) */
-
-static void tcp_update_scoreboard(struct sock *sk, int fast_rexmit)
-{
- struct tcp_sock *tp = tcp_sk(sk);
-
- if (tcp_is_sack(tp)) {
- int sacked_upto = tp->sacked_out - tp->reordering;
- if (sacked_upto >= 0)
- tcp_mark_head_lost(sk, sacked_upto, 0);
- else if (fast_rexmit)
- tcp_mark_head_lost(sk, 1, 1);
- }
+ /* Has loss detection marked at least one packet lost? */
+ return tp->lost_out != 0;
}
static bool tcp_tsopt_ecr_before(const struct tcp_sock *tp, u32 when)
@@ -2990,17 +2890,8 @@ static void tcp_process_loss(struct sock *sk, int flag, int num_dupack,
*rexmit = REXMIT_LOST;
}
-static bool tcp_force_fast_retransmit(struct sock *sk)
-{
- struct tcp_sock *tp = tcp_sk(sk);
-
- return after(tcp_highest_sack_seq(tp),
- tp->snd_una + tp->reordering * tp->mss_cache);
-}
-
/* Undo during fast recovery after partial ACK. */
-static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una,
- bool *do_lost)
+static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una)
{
struct tcp_sock *tp = tcp_sk(sk);
@@ -3025,9 +2916,6 @@ static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una,
tcp_undo_cwnd_reduction(sk, true);
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPPARTIALUNDO);
tcp_try_keep_open(sk);
- } else {
- /* Partial ACK arrived. Force fast retransmit. */
- *do_lost = tcp_force_fast_retransmit(sk);
}
return false;
}
@@ -3041,7 +2929,7 @@ static void tcp_identify_packet_loss(struct sock *sk, int *ack_flag)
if (unlikely(tcp_is_reno(tp))) {
tcp_newreno_mark_lost(sk, *ack_flag & FLAG_SND_UNA_ADVANCED);
- } else if (tcp_is_rack(sk)) {
+ } else {
u32 prior_retrans = tp->retrans_out;
if (tcp_rack_mark_lost(sk))
@@ -3070,8 +2958,6 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una,
struct tcp_sock *tp = tcp_sk(sk);
int fast_rexmit = 0, flag = *ack_flag;
bool ece_ack = flag & FLAG_ECE;
- bool do_lost = num_dupack || ((flag & FLAG_DATA_SACKED) &&
- tcp_force_fast_retransmit(sk));
if (!tp->packets_out && tp->sacked_out)
tp->sacked_out = 0;
@@ -3120,7 +3006,7 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una,
if (!(flag & FLAG_SND_UNA_ADVANCED)) {
if (tcp_is_reno(tp))
tcp_add_reno_sack(sk, num_dupack, ece_ack);
- } else if (tcp_try_undo_partial(sk, prior_snd_una, &do_lost))
+ } else if (tcp_try_undo_partial(sk, prior_snd_una))
return;
if (tcp_try_undo_dsack(sk))
@@ -3178,8 +3064,6 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una,
fast_rexmit = 1;
}
- if (!tcp_is_rack(sk) && do_lost)
- tcp_update_scoreboard(sk, fast_rexmit);
*rexmit = REXMIT_LOST;
}
--
2.50.0.rc1.591.g9c95f17f64-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint
2025-06-13 23:09 [PATCH net-next 0/3] tcp: remove obsolete RFC3517/RFC6675 code Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
@ 2025-06-13 23:09 ` Neal Cardwell
2025-06-14 22:55 ` kernel test robot
2025-06-13 23:09 ` [PATCH net-next 3/3] tcp: remove RFC3517/RFC6675 tcp_clear_retrans_hints_partial() Neal Cardwell
2 siblings, 1 reply; 8+ messages in thread
From: Neal Cardwell @ 2025-06-13 23:09 UTC (permalink / raw)
To: David Miller, Jakub Kicinski, Eric Dumazet
Cc: netdev, Neal Cardwell, Yuchung Cheng
From: Neal Cardwell <ncardwell@google.com>
Now that obsolete RFC3517/RFC6675 TCP loss detection has been removed,
we can remove the somewhat complex and intrusive code to maintain its
hint state: lost_skb_hint and lost_cnt_hint.
This commit makes tcp_clear_retrans_hints_partial() empty. We will
remove tcp_clear_retrans_hints_partial() and its call sites in the
next commit.
Suggested-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Yuchung Cheng <ycheng@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
---
.../networking/net_cachelines/tcp_sock.rst | 2 --
include/linux/tcp.h | 3 ---
include/net/tcp.h | 1 -
net/ipv4/tcp.c | 3 +--
net/ipv4/tcp_input.c | 15 ---------------
net/ipv4/tcp_output.c | 5 -----
6 files changed, 1 insertion(+), 28 deletions(-)
diff --git a/Documentation/networking/net_cachelines/tcp_sock.rst b/Documentation/networking/net_cachelines/tcp_sock.rst
index bc9b2131bf7ac..7bbda5944ee2f 100644
--- a/Documentation/networking/net_cachelines/tcp_sock.rst
+++ b/Documentation/networking/net_cachelines/tcp_sock.rst
@@ -115,7 +115,6 @@ u32 lost_out read_mostly read_m
u32 sacked_out read_mostly read_mostly tcp_left_out(tx);tcp_packets_in_flight(tx/rx);tcp_clean_rtx_queue(rx)
struct hrtimer pacing_timer
struct hrtimer compressed_ack_timer
-struct sk_buff* lost_skb_hint read_mostly tcp_clean_rtx_queue
struct sk_buff* retransmit_skb_hint read_mostly tcp_clean_rtx_queue
struct rb_root out_of_order_queue read_mostly tcp_data_queue,tcp_fast_path_check
struct sk_buff* ooo_last_skb
@@ -123,7 +122,6 @@ struct tcp_sack_block[1] duplicate_sack
struct tcp_sack_block[4] selective_acks
struct tcp_sack_block[4] recv_sack_cache
struct sk_buff* highest_sack read_write tcp_event_new_data_sent
-int lost_cnt_hint
u32 prior_ssthresh
u32 high_seq
u32 retrans_stamp
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 29f59d50dc73f..1a5737b3753d0 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -208,7 +208,6 @@ struct tcp_sock {
u32 notsent_lowat; /* TCP_NOTSENT_LOWAT */
u16 gso_segs; /* Max number of segs per GSO packet */
/* from STCP, retrans queue hinting */
- struct sk_buff *lost_skb_hint;
struct sk_buff *retransmit_skb_hint;
__cacheline_group_end(tcp_sock_read_tx);
@@ -419,8 +418,6 @@ struct tcp_sock {
struct tcp_sack_block recv_sack_cache[4];
- int lost_cnt_hint;
-
u32 prior_ssthresh; /* ssthresh saved at recovery start */
u32 high_seq; /* snd_nxt at onset of congestion */
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 5078ad868feef..f57d121837949 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1813,7 +1813,6 @@ static inline void tcp_mib_init(struct net *net)
/* from STCP */
static inline void tcp_clear_retrans_hints_partial(struct tcp_sock *tp)
{
- tp->lost_skb_hint = NULL;
}
static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index f64f8276a73cd..27d3ef83ce7b2 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -5053,9 +5053,8 @@ static void __init tcp_struct_check(void)
CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_tx, reordering);
CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_tx, notsent_lowat);
CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_tx, gso_segs);
- CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_tx, lost_skb_hint);
CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_tx, retransmit_skb_hint);
- CACHELINE_ASSERT_GROUP_SIZE(struct tcp_sock, tcp_sock_read_tx, 40);
+ CACHELINE_ASSERT_GROUP_SIZE(struct tcp_sock, tcp_sock_read_tx, 32);
/* TXRX read-mostly hotpath cache lines */
CACHELINE_ASSERT_GROUP_MEMBER(struct tcp_sock, tcp_sock_read_txrx, tsoffset);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index b52eaa45e652f..9ded9b371d98a 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1451,11 +1451,6 @@ static u8 tcp_sacktag_one(struct sock *sk,
tp->sacked_out += pcount;
/* Out-of-order packets delivered */
state->sack_delivered += pcount;
-
- /* Lost marker hint past SACKed? Tweak RFC3517 cnt */
- if (tp->lost_skb_hint &&
- before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq))
- tp->lost_cnt_hint += pcount;
}
/* D-SACK. We can detect redundant retransmission in S|R and plain R
@@ -1496,9 +1491,6 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *prev,
tcp_skb_timestamp_us(skb));
tcp_rate_skb_delivered(sk, skb, state->rate);
- if (skb == tp->lost_skb_hint)
- tp->lost_cnt_hint += pcount;
-
TCP_SKB_CB(prev)->end_seq += shifted;
TCP_SKB_CB(skb)->seq += shifted;
@@ -1531,10 +1523,6 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *prev,
if (skb == tp->retransmit_skb_hint)
tp->retransmit_skb_hint = prev;
- if (skb == tp->lost_skb_hint) {
- tp->lost_skb_hint = prev;
- tp->lost_cnt_hint -= tcp_skb_pcount(prev);
- }
TCP_SKB_CB(prev)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags;
TCP_SKB_CB(prev)->eor = TCP_SKB_CB(skb)->eor;
@@ -3319,8 +3307,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, const struct sk_buff *ack_skb,
next = skb_rb_next(skb);
if (unlikely(skb == tp->retransmit_skb_hint))
tp->retransmit_skb_hint = NULL;
- if (unlikely(skb == tp->lost_skb_hint))
- tp->lost_skb_hint = NULL;
tcp_highest_sack_replace(sk, skb, next);
tcp_rtx_queue_unlink_and_free(skb, sk);
}
@@ -3385,7 +3371,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, const struct sk_buff *ack_skb,
tcp_check_sack_reordering(sk, reord, 0);
delta = prior_sacked - tp->sacked_out;
- tp->lost_cnt_hint -= min(tp->lost_cnt_hint, delta);
}
} else if (skb && rtt_update && sack_rtt_us >= 0 &&
sack_rtt_us > tcp_stamp_us_delta(tp->tcp_mstamp,
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 3ac8d2d17e1ff..b0ffefe604b4c 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1554,11 +1554,6 @@ static void tcp_adjust_pcount(struct sock *sk, const struct sk_buff *skb, int de
if (tcp_is_reno(tp) && decr > 0)
tp->sacked_out -= min_t(u32, tp->sacked_out, decr);
- if (tp->lost_skb_hint &&
- before(TCP_SKB_CB(skb)->seq, TCP_SKB_CB(tp->lost_skb_hint)->seq) &&
- (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED))
- tp->lost_cnt_hint -= decr;
-
tcp_verify_left_out(tp);
}
--
2.50.0.rc1.591.g9c95f17f64-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 3/3] tcp: remove RFC3517/RFC6675 tcp_clear_retrans_hints_partial()
2025-06-13 23:09 [PATCH net-next 0/3] tcp: remove obsolete RFC3517/RFC6675 code Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint Neal Cardwell
@ 2025-06-13 23:09 ` Neal Cardwell
2 siblings, 0 replies; 8+ messages in thread
From: Neal Cardwell @ 2025-06-13 23:09 UTC (permalink / raw)
To: David Miller, Jakub Kicinski, Eric Dumazet
Cc: netdev, Neal Cardwell, Yuchung Cheng
From: Neal Cardwell <ncardwell@google.com>
Now that we have removed the RFC3517/RFC6675 hints,
tcp_clear_retrans_hints_partial() is empty, and can be removed.
Suggested-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Yuchung Cheng <ycheng@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
---
include/net/tcp.h | 5 -----
net/ipv4/tcp_input.c | 2 --
net/ipv4/tcp_output.c | 1 -
3 files changed, 8 deletions(-)
diff --git a/include/net/tcp.h b/include/net/tcp.h
index f57d121837949..9f852f5f8b95e 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1811,13 +1811,8 @@ static inline void tcp_mib_init(struct net *net)
}
/* from STCP */
-static inline void tcp_clear_retrans_hints_partial(struct tcp_sock *tp)
-{
-}
-
static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)
{
- tcp_clear_retrans_hints_partial(tp);
tp->retransmit_skb_hint = NULL;
}
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 9ded9b371d98a..937a0085598e5 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2769,8 +2769,6 @@ void tcp_simple_retransmit(struct sock *sk)
tcp_mark_skb_lost(sk, skb);
}
- tcp_clear_retrans_hints_partial(tp);
-
if (!tp->lost_out)
return;
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index b0ffefe604b4c..eb50746dc4820 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -3247,7 +3247,6 @@ static bool tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb)
TCP_SKB_CB(skb)->eor = TCP_SKB_CB(next_skb)->eor;
/* changed transmit queue under us so clear hints */
- tcp_clear_retrans_hints_partial(tp);
if (next_skb == tp->retransmit_skb_hint)
tp->retransmit_skb_hint = skb;
--
2.50.0.rc1.591.g9c95f17f64-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
@ 2025-06-14 20:07 ` Jakub Kicinski
2025-06-15 0:18 ` Neal Cardwell
2025-06-14 22:03 ` kernel test robot
1 sibling, 1 reply; 8+ messages in thread
From: Jakub Kicinski @ 2025-06-14 20:07 UTC (permalink / raw)
To: Neal Cardwell
Cc: David Miller, Eric Dumazet, netdev, Neal Cardwell, Yuchung Cheng
On Fri, 13 Jun 2025 19:09:04 -0400 Neal Cardwell wrote:
> RACK-TLP loss detection has been enabled as the default loss detection
> algorithm for Linux TCP since 2018, in:
>
> commit b38a51fec1c1 ("tcp: disable RFC6675 loss detection")
Hi! There is a warning here:
net/ipv4/tcp_input.c:2959:6: warning: variable 'fast_rexmit' set but not used [-Wunused-but-set-variable]
2959 | int fast_rexmit = 0, flag = *ack_flag;
| ^
and another one in patch 2:
net/ipv4/tcp_input.c:3367:29: warning: variable ‘delta’ set but not used [-Wunused-but-set-variable]
3367 | int delta;
| ^~~~~
--
pw-bot: cr
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
2025-06-14 20:07 ` Jakub Kicinski
@ 2025-06-14 22:03 ` kernel test robot
1 sibling, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-06-14 22:03 UTC (permalink / raw)
To: Neal Cardwell; +Cc: llvm, oe-kbuild-all
Hi Neal,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Neal-Cardwell/tcp-remove-obsolete-and-unused-RFC3517-RFC6675-loss-recovery-code/20250614-071032
base: net-next/main
patch link: https://lore.kernel.org/r/20250613230907.1702265-2-ncardwell.sw%40gmail.com
patch subject: [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
config: i386-buildonly-randconfig-004-20250615 (https://download.01.org/0day-ci/archive/20250615/202506150546.5gETHB6Z-lkp@intel.com/config)
compiler: clang version 20.1.2 (https://github.com/llvm/llvm-project 58df0ef89dd64126512e4ee27b4ac3fd8ddf6247)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250615/202506150546.5gETHB6Z-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506150546.5gETHB6Z-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> net/ipv4/tcp_input.c:2959:6: warning: variable 'fast_rexmit' set but not used [-Wunused-but-set-variable]
2959 | int fast_rexmit = 0, flag = *ack_flag;
| ^
1 warning generated.
vim +/fast_rexmit +2959 net/ipv4/tcp_input.c
98e36d449cc681 Yuchung Cheng 2017-01-12 2941
^1da177e4c3f41 Linus Torvalds 2005-04-16 2942 /* Process an event, which can update packets-in-flight not trivially.
^1da177e4c3f41 Linus Torvalds 2005-04-16 2943 * Main goal of this function is to calculate new estimate for left_out,
^1da177e4c3f41 Linus Torvalds 2005-04-16 2944 * taking into account both packets sitting in receiver's buffer and
^1da177e4c3f41 Linus Torvalds 2005-04-16 2945 * packets lost by network.
^1da177e4c3f41 Linus Torvalds 2005-04-16 2946 *
31ba0c10723e9e Yuchung Cheng 2016-02-02 2947 * Besides that it updates the congestion state when packet loss or ECN
31ba0c10723e9e Yuchung Cheng 2016-02-02 2948 * is detected. But it does not reduce the cwnd, it is done by the
31ba0c10723e9e Yuchung Cheng 2016-02-02 2949 * congestion control later.
^1da177e4c3f41 Linus Torvalds 2005-04-16 2950 *
^1da177e4c3f41 Linus Torvalds 2005-04-16 2951 * It does _not_ decide what to send, it is made in function
^1da177e4c3f41 Linus Torvalds 2005-04-16 2952 * tcp_xmit_retransmit_queue().
^1da177e4c3f41 Linus Torvalds 2005-04-16 2953 */
737ff314563ca2 Yuchung Cheng 2017-11-08 2954 static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una,
19119f298bb1f2 Eric Dumazet 2018-11-27 2955 int num_dupack, int *ack_flag, int *rexmit)
^1da177e4c3f41 Linus Torvalds 2005-04-16 2956 {
6687e988d9aeac Arnaldo Carvalho de Melo 2005-08-10 2957 struct inet_connection_sock *icsk = inet_csk(sk);
^1da177e4c3f41 Linus Torvalds 2005-04-16 2958 struct tcp_sock *tp = tcp_sk(sk);
31ba0c10723e9e Yuchung Cheng 2016-02-02 @2959 int fast_rexmit = 0, flag = *ack_flag;
c634e34f6ebfb7 Yousuk Seung 2020-06-26 2960 bool ece_ack = flag & FLAG_ECE;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2961
8ba6ddaaf86c4c Eric Dumazet 2017-10-05 2962 if (!tp->packets_out && tp->sacked_out)
^1da177e4c3f41 Linus Torvalds 2005-04-16 2963 tp->sacked_out = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2964
^1da177e4c3f41 Linus Torvalds 2005-04-16 2965 /* Now state machine starts.
^1da177e4c3f41 Linus Torvalds 2005-04-16 2966 * A. ECE, hence prohibit cwnd undoing, the reduction is required. */
c634e34f6ebfb7 Yousuk Seung 2020-06-26 2967 if (ece_ack)
^1da177e4c3f41 Linus Torvalds 2005-04-16 2968 tp->prior_ssthresh = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2969
^1da177e4c3f41 Linus Torvalds 2005-04-16 2970 /* B. In all the states check for reneging SACKs. */
d2a0fc372aca56 Fred Chen 2023-10-21 2971 if (tcp_check_sack_reneging(sk, ack_flag))
^1da177e4c3f41 Linus Torvalds 2005-04-16 2972 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2973
974c12360dfe6a Yuchung Cheng 2012-01-19 2974 /* C. Check consistency of the current state. */
005903bc3a0e84 Ilpo Järvinen 2007-08-09 2975 tcp_verify_left_out(tp);
^1da177e4c3f41 Linus Torvalds 2005-04-16 2976
974c12360dfe6a Yuchung Cheng 2012-01-19 2977 /* D. Check state exit conditions. State can be terminated
^1da177e4c3f41 Linus Torvalds 2005-04-16 2978 * when high_seq is ACKed. */
6687e988d9aeac Arnaldo Carvalho de Melo 2005-08-10 2979 if (icsk->icsk_ca_state == TCP_CA_Open) {
a7abf3cd76e1e1 Eric Dumazet 2021-03-11 2980 WARN_ON(tp->retrans_out != 0 && !tp->syn_data);
^1da177e4c3f41 Linus Torvalds 2005-04-16 2981 tp->retrans_stamp = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2982 } else if (!before(tp->snd_una, tp->high_seq)) {
6687e988d9aeac Arnaldo Carvalho de Melo 2005-08-10 2983 switch (icsk->icsk_ca_state) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 2984 case TCP_CA_CWR:
^1da177e4c3f41 Linus Torvalds 2005-04-16 2985 /* CWR is to be held something *above* high_seq
^1da177e4c3f41 Linus Torvalds 2005-04-16 2986 * is ACKed for CWR bit to reach receiver. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 2987 if (tp->snd_una != tp->high_seq) {
684bad1107571d Yuchung Cheng 2012-09-02 2988 tcp_end_cwnd_reduction(sk);
6687e988d9aeac Arnaldo Carvalho de Melo 2005-08-10 2989 tcp_set_ca_state(sk, TCP_CA_Open);
^1da177e4c3f41 Linus Torvalds 2005-04-16 2990 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 2991 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 2992
^1da177e4c3f41 Linus Torvalds 2005-04-16 2993 case TCP_CA_Recovery:
e60402d0a909ca Ilpo Järvinen 2007-08-09 2994 if (tcp_is_reno(tp))
^1da177e4c3f41 Linus Torvalds 2005-04-16 2995 tcp_reset_reno_sack(tp);
9e412ba7632f71 Ilpo Järvinen 2007-04-20 2996 if (tcp_try_undo_recovery(sk))
^1da177e4c3f41 Linus Torvalds 2005-04-16 2997 return;
684bad1107571d Yuchung Cheng 2012-09-02 2998 tcp_end_cwnd_reduction(sk);
^1da177e4c3f41 Linus Torvalds 2005-04-16 2999 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3000 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3001 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3002
974c12360dfe6a Yuchung Cheng 2012-01-19 3003 /* E. Process state. */
6687e988d9aeac Arnaldo Carvalho de Melo 2005-08-10 3004 switch (icsk->icsk_ca_state) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3005 case TCP_CA_Recovery:
2e6052941ae1f2 Ilpo Järvinen 2007-08-02 3006 if (!(flag & FLAG_SND_UNA_ADVANCED)) {
19119f298bb1f2 Eric Dumazet 2018-11-27 3007 if (tcp_is_reno(tp))
c634e34f6ebfb7 Yousuk Seung 2020-06-26 3008 tcp_add_reno_sack(sk, num_dupack, ece_ack);
f6e254d10bca5a Neal Cardwell 2025-06-13 3009 } else if (tcp_try_undo_partial(sk, prior_snd_una))
7026b912f97d91 Yuchung Cheng 2013-05-29 3010 return;
a29cb6914681a5 Yuchung Cheng 2021-06-02 3011
a29cb6914681a5 Yuchung Cheng 2021-06-02 3012 if (tcp_try_undo_dsack(sk))
a6458ab7fd4f42 Neal Cardwell 2024-06-26 3013 tcp_try_to_open(sk, flag);
a29cb6914681a5 Yuchung Cheng 2021-06-02 3014
a29cb6914681a5 Yuchung Cheng 2021-06-02 3015 tcp_identify_packet_loss(sk, ack_flag);
a29cb6914681a5 Yuchung Cheng 2021-06-02 3016 if (icsk->icsk_ca_state != TCP_CA_Recovery) {
a29cb6914681a5 Yuchung Cheng 2021-06-02 3017 if (!tcp_time_to_recover(sk, flag))
c7d9d6a185a7ea Yuchung Cheng 2013-05-29 3018 return;
a29cb6914681a5 Yuchung Cheng 2021-06-02 3019 /* Undo reverts the recovery state. If loss is evident,
a29cb6914681a5 Yuchung Cheng 2021-06-02 3020 * starts a new recovery (e.g. reordering then loss);
a29cb6914681a5 Yuchung Cheng 2021-06-02 3021 */
a29cb6914681a5 Yuchung Cheng 2021-06-02 3022 tcp_enter_recovery(sk, ece_ack);
c7d9d6a185a7ea Yuchung Cheng 2013-05-29 3023 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3024 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3025 case TCP_CA_Loss:
19119f298bb1f2 Eric Dumazet 2018-11-27 3026 tcp_process_loss(sk, flag, num_dupack, rexmit);
3868ab0f192581 Aananth V 2023-09-14 3027 if (icsk->icsk_ca_state != TCP_CA_Loss)
3868ab0f192581 Aananth V 2023-09-14 3028 tcp_update_rto_time(tp);
6ac06ecd3a5d1d Yuchung Cheng 2018-05-16 3029 tcp_identify_packet_loss(sk, ack_flag);
98e36d449cc681 Yuchung Cheng 2017-01-12 3030 if (!(icsk->icsk_ca_state == TCP_CA_Open ||
98e36d449cc681 Yuchung Cheng 2017-01-12 3031 (*ack_flag & FLAG_LOST_RETRANS)))
^1da177e4c3f41 Linus Torvalds 2005-04-16 3032 return;
291a00d1a70f96 Yuchung Cheng 2015-07-01 3033 /* Change state if cwnd is undone or retransmits are lost */
a8eceea84a3a35 Joe Perches 2020-03-12 3034 fallthrough;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3035 default:
e60402d0a909ca Ilpo Järvinen 2007-08-09 3036 if (tcp_is_reno(tp)) {
2e6052941ae1f2 Ilpo Järvinen 2007-08-02 3037 if (flag & FLAG_SND_UNA_ADVANCED)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3038 tcp_reset_reno_sack(tp);
c634e34f6ebfb7 Yousuk Seung 2020-06-26 3039 tcp_add_reno_sack(sk, num_dupack, ece_ack);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3040 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3041
f698204bd0bfdc Neal Cardwell 2011-11-16 3042 if (icsk->icsk_ca_state <= TCP_CA_Disorder)
9e412ba7632f71 Ilpo Järvinen 2007-04-20 3043 tcp_try_undo_dsack(sk);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3044
6ac06ecd3a5d1d Yuchung Cheng 2018-05-16 3045 tcp_identify_packet_loss(sk, ack_flag);
750ea2bafa55aa Yuchung Cheng 2012-05-02 3046 if (!tcp_time_to_recover(sk, flag)) {
31ba0c10723e9e Yuchung Cheng 2016-02-02 3047 tcp_try_to_open(sk, flag);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3048 return;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3049 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3050
5d424d5a674f78 John Heffner 2006-03-20 3051 /* MTU probe failure: don't reduce cwnd */
5d424d5a674f78 John Heffner 2006-03-20 3052 if (icsk->icsk_ca_state < TCP_CA_CWR &&
5d424d5a674f78 John Heffner 2006-03-20 3053 icsk->icsk_mtup.probe_size &&
0e7b13685f9a06 John Heffner 2006-03-20 3054 tp->snd_una == tp->mtu_probe.probe_seq_start) {
5d424d5a674f78 John Heffner 2006-03-20 3055 tcp_mtup_probe_failed(sk);
5d424d5a674f78 John Heffner 2006-03-20 3056 /* Restores the reduction we did in tcp_mtup_probe() */
40570375356c87 Eric Dumazet 2022-04-05 3057 tcp_snd_cwnd_set(tp, tcp_snd_cwnd(tp) + 1);
5d424d5a674f78 John Heffner 2006-03-20 3058 tcp_simple_retransmit(sk);
5d424d5a674f78 John Heffner 2006-03-20 3059 return;
5d424d5a674f78 John Heffner 2006-03-20 3060 }
5d424d5a674f78 John Heffner 2006-03-20 3061
^1da177e4c3f41 Linus Torvalds 2005-04-16 3062 /* Otherwise enter Recovery state */
c634e34f6ebfb7 Yousuk Seung 2020-06-26 3063 tcp_enter_recovery(sk, ece_ack);
85cc391c0e4584 Ilpo Järvinen 2007-11-15 3064 fast_rexmit = 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3065 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3066
e662ca40de846e Yuchung Cheng 2016-02-02 3067 *rexmit = REXMIT_LOST;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3068 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3069
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint
2025-06-13 23:09 ` [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint Neal Cardwell
@ 2025-06-14 22:55 ` kernel test robot
0 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-06-14 22:55 UTC (permalink / raw)
To: Neal Cardwell; +Cc: llvm, oe-kbuild-all
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=utf-8, Size: 17912 bytes --]
Hi Neal,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Neal-Cardwell/tcp-remove-obsolete-and-unused-RFC3517-RFC6675-loss-recovery-code/20250614-071032
base: net-next/main
patch link: https://lore.kernel.org/r/20250613230907.1702265-3-ncardwell.sw%40gmail.com
patch subject: [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint
config: i386-buildonly-randconfig-004-20250615 (https://download.01.org/0day-ci/archive/20250615/202506150617.IXN2yJ4v-lkp@intel.com/config)
compiler: clang version 20.1.2 (https://github.com/llvm/llvm-project 58df0ef89dd64126512e4ee27b4ac3fd8ddf6247)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250615/202506150617.IXN2yJ4v-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506150617.IXN2yJ4v-lkp@intel.com/
All warnings (new ones prefixed by >>):
net/ipv4/tcp_input.c:2947:6: warning: variable 'fast_rexmit' set but not used [-Wunused-but-set-variable]
2947 | int fast_rexmit = 0, flag = *ack_flag;
| ^
>> net/ipv4/tcp_input.c:3367:8: warning: variable 'delta' set but not used [-Wunused-but-set-variable]
3367 | int delta;
| ^
2 warnings generated.
vim +/delta +3367 net/ipv4/tcp_input.c
ad971f616aa98e Eric Dumazet 2014-10-11 3212
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3213 /* Remove acknowledged frames from the retransmission queue. If our packet
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3214 * is before the ack sequence we can discard it as it's confirmed to have
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3215 * arrived at the other end.
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3216 */
e7ed11ee945438 Yousuk Seung 2021-01-20 3217 static int tcp_clean_rtx_queue(struct sock *sk, const struct sk_buff *ack_skb,
e7ed11ee945438 Yousuk Seung 2021-01-20 3218 u32 prior_fack, u32 prior_snd_una,
c634e34f6ebfb7 Yousuk Seung 2020-06-26 3219 struct tcp_sacktag_state *sack, bool ece_ack)
^1da177e4c3f41 Linus Torvalds 2005-04-16 3220 {
2d2abbab63f672 Stephen Hemminger 2005-11-10 3221 const struct inet_connection_sock *icsk = inet_csk(sk);
9a568de4818dea Eric Dumazet 2017-05-16 3222 u64 first_ackt, last_ackt;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3223 struct tcp_sock *tp = tcp_sk(sk);
740b0f1841f6e3 Eric Dumazet 2014-02-26 3224 u32 prior_sacked = tp->sacked_out;
737ff314563ca2 Yuchung Cheng 2017-11-08 3225 u32 reord = tp->snd_nxt; /* lowest acked un-retx un-sacked seq */
75c119afe14f74 Eric Dumazet 2017-10-05 3226 struct sk_buff *skb, *next;
34a6eda163975d Peter Senna Tschudin 2013-10-02 3227 bool fully_acked = true;
31231a8a873026 Kenneth Klette Jonassen 2015-05-01 3228 long sack_rtt_us = -1L;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3229 long seq_rtt_us = -1L;
31231a8a873026 Kenneth Klette Jonassen 2015-05-01 3230 long ca_rtt_us = -1L;
7201883599ac8b Ilpo Järvinen 2007-12-30 3231 u32 pkts_acked = 0;
2f715c1dde6e17 Yuchung Cheng 2013-10-24 3232 bool rtt_update;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3233 int flag = 0;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3234
9a568de4818dea Eric Dumazet 2017-05-16 3235 first_ackt = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3236
75c119afe14f74 Eric Dumazet 2017-10-05 3237 for (skb = skb_rb_first(&sk->tcp_rtx_queue); skb; skb = next) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3238 struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
737ff314563ca2 Yuchung Cheng 2017-11-08 3239 const u32 start_seq = scb->seq;
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3240 u8 sacked = scb->sacked;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3241 u32 acked_pcount;
^1da177e4c3f41 Linus Torvalds 2005-04-16 3242
2072c228c9a05c Gavin McCullagh 2007-12-29 3243 /* Determine how many packets and what bytes were acked, tso and else */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3244 if (after(scb->end_seq, tp->snd_una)) {
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3245 if (tcp_skb_pcount(skb) == 1 ||
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3246 !after(tp->snd_una, scb->seq))
^1da177e4c3f41 Linus Torvalds 2005-04-16 3247 break;
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3248
7201883599ac8b Ilpo Järvinen 2007-12-30 3249 acked_pcount = tcp_tso_acked(sk, skb);
7201883599ac8b Ilpo Järvinen 2007-12-30 3250 if (!acked_pcount)
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3251 break;
a2a385d627e154 Eric Dumazet 2012-05-16 3252 fully_acked = false;
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3253 } else {
7201883599ac8b Ilpo Järvinen 2007-12-30 3254 acked_pcount = tcp_skb_pcount(skb);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3255 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3256
ad971f616aa98e Eric Dumazet 2014-10-11 3257 if (unlikely(sacked & TCPCB_RETRANS)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 3258 if (sacked & TCPCB_SACKED_RETRANS)
7201883599ac8b Ilpo Järvinen 2007-12-30 3259 tp->retrans_out -= acked_pcount;
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3260 flag |= FLAG_RETRANS_DATA_ACKED;
3d0d26c7976bf1 Kenneth Klette Jonassen 2015-04-11 3261 } else if (!(sacked & TCPCB_SACKED_ACKED)) {
2fd66ffba50716 Eric Dumazet 2018-09-21 3262 last_ackt = tcp_skb_timestamp_us(skb);
9a568de4818dea Eric Dumazet 2017-05-16 3263 WARN_ON_ONCE(last_ackt == 0);
9a568de4818dea Eric Dumazet 2017-05-16 3264 if (!first_ackt)
740b0f1841f6e3 Eric Dumazet 2014-02-26 3265 first_ackt = last_ackt;
740b0f1841f6e3 Eric Dumazet 2014-02-26 3266
737ff314563ca2 Yuchung Cheng 2017-11-08 3267 if (before(start_seq, reord))
737ff314563ca2 Yuchung Cheng 2017-11-08 3268 reord = start_seq;
e33099f96d99c3 Yuchung Cheng 2013-03-20 3269 if (!after(scb->end_seq, tp->high_seq))
e33099f96d99c3 Yuchung Cheng 2013-03-20 3270 flag |= FLAG_ORIG_SACK_ACKED;
c7caf8d3ed7a66 Ilpo Järvinen 2007-11-10 3271 }
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3272
ddf1af6fa00e77 Yuchung Cheng 2016-02-02 3273 if (sacked & TCPCB_SACKED_ACKED) {
7201883599ac8b Ilpo Järvinen 2007-12-30 3274 tp->sacked_out -= acked_pcount;
ddf1af6fa00e77 Yuchung Cheng 2016-02-02 3275 } else if (tcp_is_sack(tp)) {
082d4fa980b07b Yousuk Seung 2020-06-26 3276 tcp_count_delivered(tp, acked_pcount, ece_ack);
ddf1af6fa00e77 Yuchung Cheng 2016-02-02 3277 if (!tcp_skb_spurious_retrans(tp, skb))
1d0833df594390 Yuchung Cheng 2017-01-12 3278 tcp_rack_advance(tp, sacked, scb->end_seq,
2fd66ffba50716 Eric Dumazet 2018-09-21 3279 tcp_skb_timestamp_us(skb));
ddf1af6fa00e77 Yuchung Cheng 2016-02-02 3280 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3281 if (sacked & TCPCB_LOST)
7201883599ac8b Ilpo Järvinen 2007-12-30 3282 tp->lost_out -= acked_pcount;
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3283
7201883599ac8b Ilpo Järvinen 2007-12-30 3284 tp->packets_out -= acked_pcount;
7201883599ac8b Ilpo Järvinen 2007-12-30 3285 pkts_acked += acked_pcount;
b9f64820fb226a Yuchung Cheng 2016-09-19 3286 tcp_rate_skb_delivered(sk, skb, sack->rate);
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3287
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3288 /* Initial outgoing SYN's get put onto the write_queue
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3289 * just like anything else we transmit. It is not
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3290 * true data, and if we misinform our callers that
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3291 * this ACK acks real data, we will erroneously exit
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3292 * connection startup slow start one packet too
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3293 * quickly. This is severely frowned upon behavior.
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3294 */
ad971f616aa98e Eric Dumazet 2014-10-11 3295 if (likely(!(scb->tcp_flags & TCPHDR_SYN))) {
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3296 flag |= FLAG_DATA_ACKED;
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3297 } else {
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3298 flag |= FLAG_SYN_ACKED;
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3299 tp->retrans_stamp = 0;
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3300 }
009a2e3e4ec395 Ilpo Järvinen 2007-09-20 3301
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3302 if (!fully_acked)
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3303 break;
13fcf850cc2037 Ilpo Järvinen 2007-10-09 3304
e7ed11ee945438 Yousuk Seung 2021-01-20 3305 tcp_ack_tstamp(sk, skb, ack_skb, prior_snd_una);
fdb7eb21ddd3cc Yousuk Seung 2020-06-26 3306
75c119afe14f74 Eric Dumazet 2017-10-05 3307 next = skb_rb_next(skb);
ad971f616aa98e Eric Dumazet 2014-10-11 3308 if (unlikely(skb == tp->retransmit_skb_hint))
ef9da47c7cc64d Ilpo Järvinen 2008-09-20 3309 tp->retransmit_skb_hint = NULL;
2bec445f9bf35e Eric Dumazet 2020-01-22 3310 tcp_highest_sack_replace(sk, skb, next);
75c119afe14f74 Eric Dumazet 2017-10-05 3311 tcp_rtx_queue_unlink_and_free(skb, sk);
^1da177e4c3f41 Linus Torvalds 2005-04-16 3312 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3313
0f87230d1a6c25 Francis Yan 2016-11-27 3314 if (!skb)
0f87230d1a6c25 Francis Yan 2016-11-27 3315 tcp_chrono_stop(sk, TCP_CHRONO_BUSY);
0f87230d1a6c25 Francis Yan 2016-11-27 3316
33f5f57eeb0c63 Ilpo Järvinen 2008-10-07 3317 if (likely(between(tp->snd_up, prior_snd_una, tp->snd_una)))
33f5f57eeb0c63 Ilpo Järvinen 2008-10-07 3318 tp->snd_up = tp->snd_una;
33f5f57eeb0c63 Ilpo Järvinen 2008-10-07 3319
ff91e9292fc5aa Yousuk Seung 2020-06-30 3320 if (skb) {
e7ed11ee945438 Yousuk Seung 2021-01-20 3321 tcp_ack_tstamp(sk, skb, ack_skb, prior_snd_una);
ff91e9292fc5aa Yousuk Seung 2020-06-30 3322 if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)
cadbd0313bc897 Ilpo Järvinen 2007-12-31 3323 flag |= FLAG_SACK_RENEGING;
ff91e9292fc5aa Yousuk Seung 2020-06-30 3324 }
cadbd0313bc897 Ilpo Järvinen 2007-12-31 3325
9a568de4818dea Eric Dumazet 2017-05-16 3326 if (likely(first_ackt) && !(flag & FLAG_RETRANS_DATA_ACKED)) {
9a568de4818dea Eric Dumazet 2017-05-16 3327 seq_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, first_ackt);
9a568de4818dea Eric Dumazet 2017-05-16 3328 ca_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, last_ackt);
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3329
40bc6063796ec7 Yuchung Cheng 2021-09-23 3330 if (pkts_acked == 1 && fully_acked && !prior_sacked &&
40bc6063796ec7 Yuchung Cheng 2021-09-23 3331 (tp->snd_una - prior_snd_una) < tp->mss_cache &&
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3332 sack->rate->prior_delivered + 1 == tp->delivered &&
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3333 !(flag & (FLAG_CA_ALERT | FLAG_SYN_ACKED))) {
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3334 /* Conservatively mark a delayed ACK. It's typically
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3335 * from a lone runt packet over the round trip to
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3336 * a receiver w/o out-of-order or CE events.
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3337 */
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3338 flag |= FLAG_ACK_MAYBE_DELAYED;
eb36be0fd55e0a Yuchung Cheng 2018-01-17 3339 }
31231a8a873026 Kenneth Klette Jonassen 2015-05-01 3340 }
9a568de4818dea Eric Dumazet 2017-05-16 3341 if (sack->first_sackt) {
9a568de4818dea Eric Dumazet 2017-05-16 3342 sack_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, sack->first_sackt);
9a568de4818dea Eric Dumazet 2017-05-16 3343 ca_rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, sack->last_sackt);
740b0f1841f6e3 Eric Dumazet 2014-02-26 3344 }
f672258391b42a Yuchung Cheng 2015-10-16 3345 rtt_update = tcp_ack_update_rtt(sk, flag, seq_rtt_us, sack_rtt_us,
775e68a93fe4d3 Yuchung Cheng 2017-05-31 3346 ca_rtt_us, sack->rate);
ed08495c31bb99 Yuchung Cheng 2013-07-22 3347
7c46a03e67d11d Ilpo Järvinen 2007-09-20 3348 if (flag & FLAG_ACKED) {
df92c8394e6ea0 Neal Cardwell 2017-08-03 3349 flag |= FLAG_SET_XMIT_TIMER; /* set TLP or RTO timer */
72211e90501f95 Ilpo Järvinen 2009-03-14 3350 if (unlikely(icsk->icsk_mtup.probe_size &&
72211e90501f95 Ilpo Järvinen 2009-03-14 3351 !after(tp->mtu_probe.probe_seq_end, tp->snd_una))) {
72211e90501f95 Ilpo Järvinen 2009-03-14 3352 tcp_mtup_probe_success(sk);
72211e90501f95 Ilpo Järvinen 2009-03-14 3353 }
72211e90501f95 Ilpo Järvinen 2009-03-14 3354
c7caf8d3ed7a66 Ilpo Järvinen 2007-11-10 3355 if (tcp_is_reno(tp)) {
c634e34f6ebfb7 Yousuk Seung 2020-06-26 3356 tcp_remove_reno_sacks(sk, pkts_acked, ece_ack);
1236f22fbae15d Ilpo Järvinen 2018-06-29 3357
1236f22fbae15d Ilpo Järvinen 2018-06-29 3358 /* If any of the cumulatively ACKed segments was
1236f22fbae15d Ilpo Järvinen 2018-06-29 3359 * retransmitted, non-SACK case cannot confirm that
1236f22fbae15d Ilpo Järvinen 2018-06-29 3360 * progress was due to original transmission due to
1236f22fbae15d Ilpo Järvinen 2018-06-29 3361 * lack of TCPCB_SACKED_ACKED bits even if some of
1236f22fbae15d Ilpo Järvinen 2018-06-29 3362 * the packets may have been never retransmitted.
1236f22fbae15d Ilpo Järvinen 2018-06-29 3363 */
1236f22fbae15d Ilpo Järvinen 2018-06-29 3364 if (flag & FLAG_RETRANS_DATA_ACKED)
1236f22fbae15d Ilpo Järvinen 2018-06-29 3365 flag &= ~FLAG_ORIG_SACK_ACKED;
c7caf8d3ed7a66 Ilpo Järvinen 2007-11-10 3366 } else {
59a08cba6a604a Ilpo Järvinen 2009-02-28 @3367 int delta;
59a08cba6a604a Ilpo Järvinen 2009-02-28 3368
c7caf8d3ed7a66 Ilpo Järvinen 2007-11-10 3369 /* Non-retransmitted hole got filled? That's reordering */
737ff314563ca2 Yuchung Cheng 2017-11-08 3370 if (before(reord, prior_fack))
737ff314563ca2 Yuchung Cheng 2017-11-08 3371 tcp_check_sack_reordering(sk, reord, 0);
90638a04ad8484 Ilpo Järvinen 2008-09-20 3372
713bafea929201 Yuchung Cheng 2017-11-08 3373 delta = prior_sacked - tp->sacked_out;
c7caf8d3ed7a66 Ilpo Järvinen 2007-11-10 3374 }
740b0f1841f6e3 Eric Dumazet 2014-02-26 3375 } else if (skb && rtt_update && sack_rtt_us >= 0 &&
2fd66ffba50716 Eric Dumazet 2018-09-21 3376 sack_rtt_us > tcp_stamp_us_delta(tp->tcp_mstamp,
2fd66ffba50716 Eric Dumazet 2018-09-21 3377 tcp_skb_timestamp_us(skb))) {
2f715c1dde6e17 Yuchung Cheng 2013-10-24 3378 /* Do not re-arm RTO if the sack RTT is measured from data sent
2f715c1dde6e17 Yuchung Cheng 2013-10-24 3379 * after when the head was last (re)transmitted. Otherwise the
2f715c1dde6e17 Yuchung Cheng 2013-10-24 3380 * timeout may continue to extend in loss recovery.
2f715c1dde6e17 Yuchung Cheng 2013-10-24 3381 */
df92c8394e6ea0 Neal Cardwell 2017-08-03 3382 flag |= FLAG_SET_XMIT_TIMER; /* set TLP or RTO timer */
^1da177e4c3f41 Linus Torvalds 2005-04-16 3383 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 3384
756ee1729b2feb Lawrence Brakmo 2016-05-11 3385 if (icsk->icsk_ca_ops->pkts_acked) {
756ee1729b2feb Lawrence Brakmo 2016-05-11 3386 struct ack_sample sample = { .pkts_acked = pkts_acked,
40bc6063796ec7 Yuchung Cheng 2021-09-23 3387 .rtt_us = sack->rate->rtt_us };
756ee1729b2feb Lawrence Brakmo 2016-05-11 3388
40bc6063796ec7 Yuchung Cheng 2021-09-23 3389 sample.in_flight = tp->mss_cache *
40bc6063796ec7 Yuchung Cheng 2021-09-23 3390 (tp->delivered - sack->rate->prior_delivered);
756ee1729b2feb Lawrence Brakmo 2016-05-11 3391 icsk->icsk_ca_ops->pkts_acked(sk, &sample);
756ee1729b2feb Lawrence Brakmo 2016-05-11 3392 }
138998fdd12e73 Kenneth Klette Jonassen 2015-05-01 3393
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code
2025-06-14 20:07 ` Jakub Kicinski
@ 2025-06-15 0:18 ` Neal Cardwell
0 siblings, 0 replies; 8+ messages in thread
From: Neal Cardwell @ 2025-06-15 0:18 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Neal Cardwell, David Miller, Eric Dumazet, netdev, Yuchung Cheng
On Sat, Jun 14, 2025 at 4:07 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Fri, 13 Jun 2025 19:09:04 -0400 Neal Cardwell wrote:
> > RACK-TLP loss detection has been enabled as the default loss detection
> > algorithm for Linux TCP since 2018, in:
> >
> > commit b38a51fec1c1 ("tcp: disable RFC6675 loss detection")
>
> Hi! There is a warning here:
>
> net/ipv4/tcp_input.c:2959:6: warning: variable 'fast_rexmit' set but not used [-Wunused-but-set-variable]
> 2959 | int fast_rexmit = 0, flag = *ack_flag;
> | ^
>
> and another one in patch 2:
>
> net/ipv4/tcp_input.c:3367:29: warning: variable ‘delta’ set but not used [-Wunused-but-set-variable]
> 3367 | int delta;
> | ^~~~~
Sorry about that! Sent a v2:
https://lore.kernel.org/netdev/20250615001435.2390793-1-ncardwell.sw@gmail.com/T/#t
thanks,
neal
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-06-15 0:18 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-13 23:09 [PATCH net-next 0/3] tcp: remove obsolete RFC3517/RFC6675 code Neal Cardwell
2025-06-13 23:09 ` [PATCH net-next 1/3] tcp: remove obsolete and unused RFC3517/RFC6675 loss recovery code Neal Cardwell
2025-06-14 20:07 ` Jakub Kicinski
2025-06-15 0:18 ` Neal Cardwell
2025-06-14 22:03 ` kernel test robot
2025-06-13 23:09 ` [PATCH net-next 2/3] tcp: remove RFC3517/RFC6675 hint state: lost_skb_hint, lost_cnt_hint Neal Cardwell
2025-06-14 22:55 ` kernel test robot
2025-06-13 23:09 ` [PATCH net-next 3/3] tcp: remove RFC3517/RFC6675 tcp_clear_retrans_hints_partial() Neal Cardwell
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.