]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tcp: make tcp_v{4,6}_send_check() static
authorEric Dumazet <edumazet@google.com>
Mon, 23 Feb 2026 10:07:29 +0000 (10:07 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 25 Feb 2026 01:16:09 +0000 (17:16 -0800)
tcp_v{4,6}_send_check() are only called from tcp_output.c
and should be made static so that the compiler does not need
to put an out of line copy of them.

Remove (struct inet_connection_sock_af_ops) send_check field
and use instead @net_header_len.

Move @net_header_len close to @queue_xmit for data locality
as both are used in TCP tx fast path.

$ scripts/bloat-o-meter -t vmlinux.2 vmlinux.3
add/remove: 0/2 grow/shrink: 0/3 up/down: 0/-172 (-172)
Function                                     old     new   delta
__tcp_transmit_skb                          3426    3423      -3
tcp_v4_send_check                            136     132      -4
mptcp_subflow_init                           777     763     -14
__pfx_tcp_v6_send_check                       16       -     -16
tcp_v6_send_check                            135       -    -135
Total: Before=25143196, After=25143024, chg -0.00%

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20260223100729.3761597-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/inet_connection_sock.h
include/net/tcp.h
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_output.c
net/ipv6/tcp_ipv6.c
net/mptcp/subflow.c
net/tls/tls_device_fallback.c

index ecb362025c4e5183ec78aef4b45c249da87c19ea..bbc9355871c767b51e3d1a4d2436022a8556416c 100644 (file)
@@ -34,7 +34,7 @@ struct tcp_congestion_ops;
  */
 struct inet_connection_sock_af_ops {
        int         (*queue_xmit)(struct sock *sk, struct sk_buff *skb, struct flowi *fl);
-       void        (*send_check)(struct sock *sk, struct sk_buff *skb);
+       u16         net_header_len;
        int         (*rebuild_header)(struct sock *sk);
        void        (*sk_rx_dst_set)(struct sock *sk, const struct sk_buff *skb);
        int         (*conn_request)(struct sock *sk, struct sk_buff *skb);
@@ -43,7 +43,6 @@ struct inet_connection_sock_af_ops {
                                      struct dst_entry *dst,
                                      struct request_sock *req_unhash,
                                      bool *own_req);
-       u16         net_header_len;
        int         (*setsockopt)(struct sock *sk, int level, int optname,
                                  sockptr_t optval, unsigned int optlen);
        int         (*getsockopt)(struct sock *sk, int level, int optname,
index feaddce9d80523a9e7bd9db4c691736859c48c91..dfcd38089f113389b82d90e5f45a54a618f2d590 100644 (file)
@@ -531,7 +531,6 @@ u16 tcp_get_syncookie_mss(struct request_sock_ops *rsk_ops,
  *     TCP v4 functions exported for the inet6 API
  */
 
-void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
 void tcp_v4_mtu_reduced(struct sock *sk);
 void tcp_req_err(struct sock *sk, u32 seq, bool abort);
 void tcp_ld_RTO_revert(struct sock *sk, u32 seq);
@@ -1132,8 +1131,6 @@ static inline int tcp_v6_sdif(const struct sk_buff *skb)
 
 extern const struct inet_connection_sock_af_ops ipv6_specific;
 
-void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb);
-
 INDIRECT_CALLABLE_DECLARE(int tcp_v6_rcv(struct sk_buff *skb));
 void tcp_v6_early_demux(struct sk_buff *skb);
 
index da708aff06230615bdc9cc19fcd8b2bd91462eff..bd613e401d4865dcb658409b7a54d1a77e1e065c 100644 (file)
@@ -2405,7 +2405,6 @@ EXPORT_IPV6_MOD(inet_sk_rx_dst_set);
 
 const struct inet_connection_sock_af_ops ipv4_specific = {
        .queue_xmit        = ip_queue_xmit,
-       .send_check        = tcp_v4_send_check,
        .rebuild_header    = inet_sk_rebuild_header,
        .sk_rx_dst_set     = inet_sk_rx_dst_set,
        .conn_request      = tcp_v4_conn_request,
index fdddb16630a5108607496bfdc4d603baa43de621..1ef419c66a0ebad6422be73a57afaba044467148 100644 (file)
@@ -1498,22 +1498,20 @@ INDIRECT_CALLABLE_DECLARE(int ip_queue_xmit(struct sock *sk, struct sk_buff *skb
 INDIRECT_CALLABLE_DECLARE(int inet6_csk_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl));
 
 /* This routine computes an IPv4 TCP checksum. */
-void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb)
+static void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb)
 {
        const struct inet_sock *inet = inet_sk(sk);
 
        __tcp_v4_send_check(skb, inet->inet_saddr, inet->inet_daddr);
 }
-EXPORT_IPV6_MOD(tcp_v4_send_check);
 
 #if IS_ENABLED(CONFIG_IPV6)
 #include <net/ip6_checksum.h>
 
-void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
+static void tcp_v6_send_check(struct sock *sk, struct sk_buff *skb)
 {
        __tcp_v6_send_check(skb, &sk->sk_v6_rcv_saddr, &sk->sk_v6_daddr);
 }
-EXPORT_IPV6_MOD(tcp_v6_send_check);
 #endif
 
 /* This routine actually transmits TCP packets queued in by
@@ -1678,7 +1676,7 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
        bpf_skops_write_hdr_opt(sk, skb, NULL, NULL, 0, &opts);
 
 #if IS_ENABLED(CONFIG_IPV6)
-       if (likely(icsk->icsk_af_ops->send_check == tcp_v6_send_check))
+       if (likely(icsk->icsk_af_ops->net_header_len == sizeof(struct ipv6hdr)))
                tcp_v6_send_check(sk, skb);
        else
 #endif
index 306ca0585b4a60fcaafcbc9656a5fe36ad21d1b2..f17da56b449ef30675469e033e0173059791443f 100644 (file)
@@ -2017,7 +2017,6 @@ static struct timewait_sock_ops tcp6_timewait_sock_ops = {
 
 const struct inet_connection_sock_af_ops ipv6_specific = {
        .queue_xmit        = inet6_csk_xmit,
-       .send_check        = tcp_v6_send_check,
        .rebuild_header    = inet6_sk_rebuild_header,
        .sk_rx_dst_set     = inet6_sk_rx_dst_set,
        .conn_request      = tcp_v6_conn_request,
@@ -2049,7 +2048,6 @@ static const struct tcp_sock_af_ops tcp_sock_ipv6_specific = {
  */
 static const struct inet_connection_sock_af_ops ipv6_mapped = {
        .queue_xmit        = ip_queue_xmit,
-       .send_check        = tcp_v4_send_check,
        .rebuild_header    = inet_sk_rebuild_header,
        .sk_rx_dst_set     = inet_sk_rx_dst_set,
        .conn_request      = tcp_v6_conn_request,
index f66129f1e649248e00215d254c925f66c3fffa6a..dd79c5b37a6b62750b62443d911c9fedd67d9d17 100644 (file)
@@ -2190,7 +2190,6 @@ void __init mptcp_subflow_init(void)
 
        subflow_v6m_specific = subflow_v6_specific;
        subflow_v6m_specific.queue_xmit = ipv4_specific.queue_xmit;
-       subflow_v6m_specific.send_check = ipv4_specific.send_check;
        subflow_v6m_specific.net_header_len = ipv4_specific.net_header_len;
        subflow_v6m_specific.mtu_reduced = ipv4_specific.mtu_reduced;
        subflow_v6m_specific.rebuild_header = subflow_rebuild_header;
index 03d508a45aaee9218bb2deed542534785f2019d6..de7d86bdd7ec99df5be4215ff79dbd5e86e49934 100644 (file)
@@ -149,9 +149,6 @@ static int tls_enc_records(struct aead_request *aead_req,
        return rc;
 }
 
-/* Can't use icsk->icsk_af_ops->send_check here because the ip addresses
- * might have been changed by NAT.
- */
 static void update_chksum(struct sk_buff *skb, int headln)
 {
        struct tcphdr *th = tcp_hdr(skb);