]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
udp: Remove struct proto.h.udp_table.
authorKuniyuki Iwashima <kuniyu@google.com>
Wed, 11 Mar 2026 05:19:57 +0000 (05:19 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Mar 2026 01:57:45 +0000 (18:57 -0700)
Since UDP and UDP-Lite had dedicated socket hash tables for
each, we have had to fetch them from different pointers.

UDP always has its global or per-netns table in
net->ipv4.udp_table and struct proto.h.udp_table is NULL.

OTOH, UDP-Lite had only one global table in the pointer.

We no longer use the field.

Let's remove it and udp_get_table_prot().

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20260311052020.1213705-11-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sock.h
net/ipv4/udp.c
net/ipv6/udp.c

index 16a1b8895206a9038d8bc952f9732645f487e15d..7d51ac9e7d9a87a7f6f0453a3d3e2c6ed34dc151 100644 (file)
@@ -1392,7 +1392,6 @@ struct proto {
 
        union {
                struct inet_hashinfo    *hashinfo;
-               struct udp_table        *udp_table;
                struct raw_hashinfo     *raw_hash;
                struct smc_hashinfo     *smc_hash;
        } h;
index d47ca721ef0d6bf502c8f3d27dfa929e8bf5047e..a7ca727347cec795c77b9a852f474b7cee917908 100644 (file)
@@ -134,11 +134,6 @@ EXPORT_PER_CPU_SYMBOL_GPL(udp_memory_per_cpu_fw_alloc);
 #define MAX_UDP_PORTS 65536
 #define PORTS_PER_CHAIN (MAX_UDP_PORTS / UDP_HTABLE_SIZE_MIN_PERNET)
 
-static struct udp_table *udp_get_table_prot(struct sock *sk)
-{
-       return sk->sk_prot->h.udp_table ? : sock_net(sk)->ipv4.udp_table;
-}
-
 static int udp_lib_lport_inuse(struct net *net, __u16 num,
                               const struct udp_hslot *hslot,
                               unsigned long *bitmap,
@@ -240,11 +235,13 @@ static int udp_reuseport_add_sock(struct sock *sk, struct udp_hslot *hslot)
 int udp_lib_get_port(struct sock *sk, unsigned short snum,
                     unsigned int hash2_nulladdr)
 {
-       struct udp_table *udptable = udp_get_table_prot(sk);
        struct udp_hslot *hslot, *hslot2;
        struct net *net = sock_net(sk);
+       struct udp_table *udptable;
        int error = -EADDRINUSE;
 
+       udptable = net->ipv4.udp_table;
+
        if (!snum) {
                DECLARE_BITMAP(bitmap, PORTS_PER_CHAIN);
                unsigned short first, last;
@@ -2224,12 +2221,13 @@ EXPORT_IPV6_MOD(udp_disconnect);
 void udp_lib_unhash(struct sock *sk)
 {
        if (sk_hashed(sk)) {
-               struct udp_table *udptable = udp_get_table_prot(sk);
                struct udp_hslot *hslot, *hslot2;
+               struct net *net = sock_net(sk);
+               struct udp_table *udptable;
 
                sock_rps_delete_flow(sk);
-               hslot  = udp_hashslot(udptable, sock_net(sk),
-                                     udp_sk(sk)->udp_port_hash);
+               udptable = net->ipv4.udp_table;
+               hslot  = udp_hashslot(udptable, net, udp_sk(sk)->udp_port_hash);
                hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash);
 
                spin_lock_bh(&hslot->lock);
@@ -2238,7 +2236,7 @@ void udp_lib_unhash(struct sock *sk)
                if (sk_del_node_init_rcu(sk)) {
                        hslot->count--;
                        inet_sk(sk)->inet_num = 0;
-                       sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
+                       sock_prot_inuse_add(net, sk->sk_prot, -1);
 
                        spin_lock(&hslot2->lock);
                        hlist_del_init_rcu(&udp_sk(sk)->udp_portaddr_node);
@@ -2258,11 +2256,12 @@ EXPORT_IPV6_MOD(udp_lib_unhash);
 void udp_lib_rehash(struct sock *sk, u16 newhash, u16 newhash4)
 {
        if (sk_hashed(sk)) {
-               struct udp_table *udptable = udp_get_table_prot(sk);
                struct udp_hslot *hslot, *hslot2, *nhslot2;
+               struct net *net = sock_net(sk);
+               struct udp_table *udptable;
 
-               hslot = udp_hashslot(udptable, sock_net(sk),
-                                    udp_sk(sk)->udp_port_hash);
+               udptable = net->ipv4.udp_table;
+               hslot = udp_hashslot(udptable, net, udp_sk(sk)->udp_port_hash);
                hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash);
                nhslot2 = udp_hashslot2(udptable, newhash);
 
@@ -3175,7 +3174,6 @@ struct proto udp_prot = {
        .sysctl_wmem_offset     = offsetof(struct net, ipv4.sysctl_udp_wmem_min),
        .sysctl_rmem_offset     = offsetof(struct net, ipv4.sysctl_udp_rmem_min),
        .obj_size               = sizeof(struct udp_sock),
-       .h.udp_table            = NULL,
        .diag_destroy           = udp_abort,
 };
 EXPORT_SYMBOL(udp_prot);
index c3d8b5ede164ff314fe4da8eb6d227548143e2bb..5bddbf457b61f218169ff18382964ee0487c0ccf 100644 (file)
@@ -1924,7 +1924,6 @@ struct proto udpv6_prot = {
        .sysctl_rmem_offset     = offsetof(struct net, ipv4.sysctl_udp_rmem_min),
        .obj_size               = sizeof(struct udp6_sock),
        .ipv6_pinfo_offset = offsetof(struct udp6_sock, inet6),
-       .h.udp_table            = NULL,
        .diag_destroy           = udp_abort,
 };