Commit b6b67141 authored by Stanislav Fomichev's avatar Stanislav Fomichev Committed by Jakub Kicinski
Browse files

net: create netdev_nl_sock to wrap bindings list



No functional changes. Next patches will add more granular locking
to netdev_nl_sock.

Signed-off-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Reviewed-by: default avatarMina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250311144026.4154277-2-sdf@fomichev.me


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 17fef204
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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:
+11 −0
Original line number Diff line number Diff line
/* 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 */
+2 −2
Original line number Diff line number Diff line
@@ -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,
};
+3 −3
Original line number Diff line number Diff line
@@ -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 */
+9 −10
Original line number Diff line number Diff line
@@ -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 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
	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();