]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: inline tcp_chrono_start()
authorEric Dumazet <edumazet@google.com>
Sun, 8 Mar 2026 12:35:49 +0000 (12:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Mar 2026 02:34:00 +0000 (19:34 -0700)
tcp_chrono_start() is small enough, and used in TCP sendmsg()
fast path (from tcp_skb_entail()).

Note clang is already inlining it from functions in tcp_output.c.

Inlining it improves performance and reduces bloat :

$ scripts/bloat-o-meter -t vmlinux.old vmlinux.new
add/remove: 0/2 grow/shrink: 1/0 up/down: 1/-84 (-83)
Function                                     old     new   delta
tcp_skb_entail                               280     281      +1
__pfx_tcp_chrono_start                        16       -     -16
tcp_chrono_start                              68       -     -68
Total: Before=25192434, After=25192351, chg -0.00%

Note that tcp_chrono_stop() is too big.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Neal Cardwell <ncardwell@google.com>
Link: https://patch.msgid.link/20260308123549.2924460-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/tcp.h
net/ipv4/tcp_output.c

index f07aef7faa65f8bfcdf93c9fe943f9b4d4a0dddb..9f0aee9e5d76d3ef5be75586bd289583e48c8baf 100644 (file)
@@ -2159,7 +2159,30 @@ enum tcp_chrono {
        __TCP_CHRONO_MAX,
 };
 
-void tcp_chrono_start(struct sock *sk, const enum tcp_chrono type);
+static inline void tcp_chrono_set(struct tcp_sock *tp, const enum tcp_chrono new)
+{
+       const u32 now = tcp_jiffies32;
+       enum tcp_chrono old = tp->chrono_type;
+
+       if (old > TCP_CHRONO_UNSPEC)
+               tp->chrono_stat[old - 1] += now - tp->chrono_start;
+       tp->chrono_start = now;
+       tp->chrono_type = new;
+}
+
+static inline void tcp_chrono_start(struct sock *sk, const enum tcp_chrono type)
+{
+       struct tcp_sock *tp = tcp_sk(sk);
+
+       /* If there are multiple conditions worthy of tracking in a
+        * chronograph then the highest priority enum takes precedence
+        * over the other conditions. So that if something "more interesting"
+        * starts happening, stop the previous chrono and start a new one.
+        */
+       if (type > tp->chrono_type)
+               tcp_chrono_set(tp, type);
+}
+
 void tcp_chrono_stop(struct sock *sk, const enum tcp_chrono type);
 
 /* This helper is needed, because skb->tcp_tsorted_anchor uses
index 4377b3673da9549b4041c10e673a2ba11015cbd2..a53802f28dd1788eda6c10654e91e918a42b1380 100644 (file)
@@ -2903,30 +2903,6 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb,
        return false;
 }
 
-static void tcp_chrono_set(struct tcp_sock *tp, const enum tcp_chrono new)
-{
-       const u32 now = tcp_jiffies32;
-       enum tcp_chrono old = tp->chrono_type;
-
-       if (old > TCP_CHRONO_UNSPEC)
-               tp->chrono_stat[old - 1] += now - tp->chrono_start;
-       tp->chrono_start = now;
-       tp->chrono_type = new;
-}
-
-void tcp_chrono_start(struct sock *sk, const enum tcp_chrono type)
-{
-       struct tcp_sock *tp = tcp_sk(sk);
-
-       /* If there are multiple conditions worthy of tracking in a
-        * chronograph then the highest priority enum takes precedence
-        * over the other conditions. So that if something "more interesting"
-        * starts happening, stop the previous chrono and start a new one.
-        */
-       if (type > tp->chrono_type)
-               tcp_chrono_set(tp, type);
-}
-
 void tcp_chrono_stop(struct sock *sk, const enum tcp_chrono type)
 {
        struct tcp_sock *tp = tcp_sk(sk);