inet: move tcp_protocol and udp_protocol to net_hotdata
authorEric Dumazet <edumazet@google.com>
Wed, 6 Mar 2024 16:00:26 +0000 (16:00 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 8 Mar 2024 05:12:43 +0000 (21:12 -0800)
These structures are read in rx path, move them to net_hotdata
for better cache locality.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20240306160031.874438-14-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/hotdata.h
net/ipv4/af_inet.c

index 03d758d25c02864b00e0a557603b64dc9d749b9c..87215f7ac200f2ba34de9b52841bc0c9e4849857 100644 (file)
@@ -11,7 +11,9 @@ struct net_hotdata {
 #if IS_ENABLED(CONFIG_INET)
        struct packet_offload   ip_packet_offload;
        struct net_offload      tcpv4_offload;
+       struct net_protocol     tcp_protocol;
        struct net_offload      udpv4_offload;
+       struct net_protocol     udp_protocol;
        struct packet_offload   ipv6_packet_offload;
        struct net_offload      tcpv6_offload;
 #if IS_ENABLED(CONFIG_IPV6)
index 08dda6955562ea6b89e02b8299b03ab52b342f27..6f1cfd176e7b84f23d8a5e505bf8e13b2b755f06 100644 (file)
@@ -1751,19 +1751,6 @@ static const struct net_protocol igmp_protocol = {
 };
 #endif
 
-static const struct net_protocol tcp_protocol = {
-       .handler        =       tcp_v4_rcv,
-       .err_handler    =       tcp_v4_err,
-       .no_policy      =       1,
-       .icmp_strict_tag_validation = 1,
-};
-
-static const struct net_protocol udp_protocol = {
-       .handler =      udp_rcv,
-       .err_handler =  udp_err,
-       .no_policy =    1,
-};
-
 static const struct net_protocol icmp_protocol = {
        .handler =      icmp_rcv,
        .err_handler =  icmp_err,
@@ -1992,9 +1979,22 @@ static int __init inet_init(void)
 
        if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) < 0)
                pr_crit("%s: Cannot add ICMP protocol\n", __func__);
-       if (inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0)
+
+       net_hotdata.udp_protocol = (struct net_protocol) {
+               .handler =      udp_rcv,
+               .err_handler =  udp_err,
+               .no_policy =    1,
+       };
+       if (inet_add_protocol(&net_hotdata.udp_protocol, IPPROTO_UDP) < 0)
                pr_crit("%s: Cannot add UDP protocol\n", __func__);
-       if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0)
+
+       net_hotdata.tcp_protocol = (struct net_protocol) {
+               .handler        =       tcp_v4_rcv,
+               .err_handler    =       tcp_v4_err,
+               .no_policy      =       1,
+               .icmp_strict_tag_validation = 1,
+       };
+       if (inet_add_protocol(&net_hotdata.tcp_protocol, IPPROTO_TCP) < 0)
                pr_crit("%s: Cannot add TCP protocol\n", __func__);
 #ifdef CONFIG_IP_MULTICAST
        if (inet_add_protocol(&igmp_protocol, IPPROTO_IGMP) < 0)