]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: move tcp_rack_advance() to tcp_input.c
authorEric Dumazet <edumazet@google.com>
Tue, 27 Jan 2026 03:21:47 +0000 (03:21 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 Jan 2026 03:31:51 +0000 (19:31 -0800)
tcp_rack_advance() is called from tcp_ack() and tcp_sacktag_one().

Moving it to tcp_input.c allows the compiler to inline it and save
both space and cpu cycles in TCP fast path.

$ scripts/bloat-o-meter -t vmlinux.1 vmlinux.2
add/remove: 0/2 grow/shrink: 1/1 up/down: 98/-132 (-34)
Function                                     old     new   delta
tcp_ack                                     5741    5839     +98
tcp_sacktag_one                              407     395     -12
__pfx_tcp_rack_advance                        16       -     -16
tcp_rack_advance                             104       -    -104
Total: Before=22572680, After=22572646, chg -0.00%

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20260127032147.3498272-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/tcp.h
net/ipv4/tcp_input.c
net/ipv4/tcp_recovery.c

index a4d9f263ea68cb73d888f252558f372a582321f5..f1cf9e6730c85529bfcfc39543c8239e62df3a18 100644 (file)
@@ -2514,8 +2514,6 @@ void tcp_newreno_mark_lost(struct sock *sk, bool snd_una_advanced);
 extern s32 tcp_rack_skb_timeout(struct tcp_sock *tp, struct sk_buff *skb,
                                u32 reo_wnd);
 extern bool tcp_rack_mark_lost(struct sock *sk);
-extern void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
-                            u64 xmit_time);
 extern void tcp_rack_reo_timeout(struct sock *sk);
 
 /* tcp_plb.c */
index d504a9a9b6ec66363ab5537907522a2d73d019a4..a2a872382fc003cb74ad048338cc4ae5d9a833e2 100644 (file)
@@ -1558,6 +1558,38 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb,
        return in_sack;
 }
 
+/* Record the most recently (re)sent time among the (s)acked packets
+ * This is "Step 3: Advance RACK.xmit_time and update RACK.RTT" from
+ * draft-cheng-tcpm-rack-00.txt
+ */
+static void tcp_rack_advance(struct tcp_sock *tp, u8 sacked,
+                            u32 end_seq, u64 xmit_time)
+{
+       u32 rtt_us;
+
+       rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, xmit_time);
+       if (rtt_us < tcp_min_rtt(tp) && (sacked & TCPCB_RETRANS)) {
+               /* If the sacked packet was retransmitted, it's ambiguous
+                * whether the retransmission or the original (or the prior
+                * retransmission) was sacked.
+                *
+                * If the original is lost, there is no ambiguity. Otherwise
+                * we assume the original can be delayed up to aRTT + min_rtt.
+                * the aRTT term is bounded by the fast recovery or timeout,
+                * so it's at least one RTT (i.e., retransmission is at least
+                * an RTT later).
+                */
+               return;
+       }
+       tp->rack.advanced = 1;
+       tp->rack.rtt_us = rtt_us;
+       if (tcp_skb_sent_after(xmit_time, tp->rack.mstamp,
+                              end_seq, tp->rack.end_seq)) {
+               tp->rack.mstamp = xmit_time;
+               tp->rack.end_seq = end_seq;
+       }
+}
+
 /* Mark the given newly-SACKed range as such, adjusting counters and hints. */
 static u8 tcp_sacktag_one(struct sock *sk,
                          struct tcp_sacktag_state *state, u8 sacked,
index 40732b84771e6db4267a71d51631699425ac1a7b..1396467510736f309d7f158b41c0128aa4bb2f2d 100644 (file)
@@ -111,38 +111,6 @@ bool tcp_rack_mark_lost(struct sock *sk)
        return !!timeout;
 }
 
-/* Record the most recently (re)sent time among the (s)acked packets
- * This is "Step 3: Advance RACK.xmit_time and update RACK.RTT" from
- * draft-cheng-tcpm-rack-00.txt
- */
-void tcp_rack_advance(struct tcp_sock *tp, u8 sacked, u32 end_seq,
-                     u64 xmit_time)
-{
-       u32 rtt_us;
-
-       rtt_us = tcp_stamp_us_delta(tp->tcp_mstamp, xmit_time);
-       if (rtt_us < tcp_min_rtt(tp) && (sacked & TCPCB_RETRANS)) {
-               /* If the sacked packet was retransmitted, it's ambiguous
-                * whether the retransmission or the original (or the prior
-                * retransmission) was sacked.
-                *
-                * If the original is lost, there is no ambiguity. Otherwise
-                * we assume the original can be delayed up to aRTT + min_rtt.
-                * the aRTT term is bounded by the fast recovery or timeout,
-                * so it's at least one RTT (i.e., retransmission is at least
-                * an RTT later).
-                */
-               return;
-       }
-       tp->rack.advanced = 1;
-       tp->rack.rtt_us = rtt_us;
-       if (tcp_skb_sent_after(xmit_time, tp->rack.mstamp,
-                              end_seq, tp->rack.end_seq)) {
-               tp->rack.mstamp = xmit_time;
-               tp->rack.end_seq = end_seq;
-       }
-}
-
 /* We have waited long enough to accommodate reordering. Mark the expired
  * packets lost and retransmit them.
  */