net: create netdev_nl_sock to wrap bindings list
authorStanislav Fomichev <sdf@fomichev.me>
Tue, 11 Mar 2025 14:40:24 +0000 (07:40 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 12 Mar 2025 20:32:35 +0000 (13:32 -0700)
No functional changes. Next patches will add more granular locking
to netdev_nl_sock.

Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250311144026.4154277-2-sdf@fomichev.me
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/netlink/specs/netdev.yaml
include/net/netdev_netlink.h [new file with mode: 0644]
net/core/netdev-genl-gen.c
net/core/netdev-genl-gen.h
net/core/netdev-genl.c

index 36f1152..f5e0750 100644 (file)
@@ -745,8 +745,8 @@ operations:
             - irq-suspend-timeout
 
 kernel-family:
-  headers: [ "linux/list.h"]
-  sock-priv: struct list_head
+  headers: [ "net/netdev_netlink.h"]
+  sock-priv: struct netdev_nl_sock
 
 mcast-groups:
   list:
diff --git a/include/net/netdev_netlink.h b/include/net/netdev_netlink.h
new file mode 100644 (file)
index 0000000..1599573
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __NET_NETDEV_NETLINK_H
+#define __NET_NETDEV_NETLINK_H
+
+#include <linux/list.h>
+
+struct netdev_nl_sock {
+       struct list_head bindings;
+};
+
+#endif /* __NET_NETDEV_NETLINK_H */
index 996ac6a..739f7b6 100644 (file)
@@ -9,7 +9,7 @@
 #include "netdev-genl-gen.h"
 
 #include <uapi/linux/netdev.h>
-#include <linux/list.h>
+#include <net/netdev_netlink.h>
 
 /* Integer value ranges */
 static const struct netlink_range_validation netdev_a_page_pool_id_range = {
@@ -217,7 +217,7 @@ struct genl_family netdev_nl_family __ro_after_init = {
        .n_split_ops    = ARRAY_SIZE(netdev_nl_ops),
        .mcgrps         = netdev_nl_mcgrps,
        .n_mcgrps       = ARRAY_SIZE(netdev_nl_mcgrps),
-       .sock_priv_size = sizeof(struct list_head),
+       .sock_priv_size = sizeof(struct netdev_nl_sock),
        .sock_priv_init = __netdev_nl_sock_priv_init,
        .sock_priv_destroy = __netdev_nl_sock_priv_destroy,
 };
index e09dd75..17d39fd 100644 (file)
@@ -10,7 +10,7 @@
 #include <net/genetlink.h>
 
 #include <uapi/linux/netdev.h>
-#include <linux/list.h>
+#include <net/netdev_netlink.h>
 
 /* Common nested types */
 extern const struct nla_policy netdev_page_pool_info_nl_policy[NETDEV_A_PAGE_POOL_IFINDEX + 1];
@@ -42,7 +42,7 @@ enum {
 
 extern struct genl_family netdev_nl_family;
 
-void netdev_nl_sock_priv_init(struct list_head *priv);
-void netdev_nl_sock_priv_destroy(struct list_head *priv);
+void netdev_nl_sock_priv_init(struct netdev_nl_sock *priv);
+void netdev_nl_sock_priv_destroy(struct netdev_nl_sock *priv);
 
 #endif /* _LINUX_NETDEV_GEN_H */
index 2b77418..a219be9 100644 (file)
@@ -829,8 +829,8 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct nlattr *tb[ARRAY_SIZE(netdev_queue_id_nl_policy)];
        struct net_devmem_dmabuf_binding *binding;
-       struct list_head *sock_binding_list;
        u32 ifindex, dmabuf_fd, rxq_idx;
+       struct netdev_nl_sock *priv;
        struct net_device *netdev;
        struct sk_buff *rsp;
        struct nlattr *attr;
@@ -845,10 +845,9 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
        ifindex = nla_get_u32(info->attrs[NETDEV_A_DEV_IFINDEX]);
        dmabuf_fd = nla_get_u32(info->attrs[NETDEV_A_DMABUF_FD]);
 
-       sock_binding_list = genl_sk_priv_get(&netdev_nl_family,
-                                            NETLINK_CB(skb).sk);
-       if (IS_ERR(sock_binding_list))
-               return PTR_ERR(sock_binding_list);
+       priv = genl_sk_priv_get(&netdev_nl_family, NETLINK_CB(skb).sk);
+       if (IS_ERR(priv))
+               return PTR_ERR(priv);
 
        rsp = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
        if (!rsp)
@@ -909,7 +908,7 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
                        goto err_unbind;
        }
 
-       list_add(&binding->list, sock_binding_list);
+       list_add(&binding->list, &priv->bindings);
 
        nla_put_u32(rsp, NETDEV_A_DMABUF_ID, binding->id);
        genlmsg_end(rsp, hdr);
@@ -931,17 +930,17 @@ err_genlmsg_free:
        return err;
 }
 
-void netdev_nl_sock_priv_init(struct list_head *priv)
+void netdev_nl_sock_priv_init(struct netdev_nl_sock *priv)
 {
-       INIT_LIST_HEAD(priv);
+       INIT_LIST_HEAD(&priv->bindings);
 }
 
-void netdev_nl_sock_priv_destroy(struct list_head *priv)
+void netdev_nl_sock_priv_destroy(struct netdev_nl_sock *priv)
 {
        struct net_devmem_dmabuf_binding *binding;
        struct net_devmem_dmabuf_binding *temp;
 
-       list_for_each_entry_safe(binding, temp, priv, list) {
+       list_for_each_entry_safe(binding, temp, &priv->bindings, list) {
                rtnl_lock();
                net_devmem_unbind_dmabuf(binding);
                rtnl_unlock();