Skip to content

Commit

Permalink
net: add granular lock for the netdev netlink socket
Browse files Browse the repository at this point in the history
As we move away from rtnl_lock for queue ops, introduce
per-netdev_nl_sock lock.

Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250311144026.4154277-3-sdf@fomichev.me
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Stanislav Fomichev authored and Jakub Kicinski committed Mar 12, 2025
1 parent b6b6714 commit 10eef09
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/net/netdev_netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <linux/list.h>

struct netdev_nl_sock {
struct mutex lock;
struct list_head bindings;
};

Expand Down
6 changes: 6 additions & 0 deletions net/core/netdev-genl.c
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,7 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
goto err_genlmsg_free;
}

mutex_lock(&priv->lock);
rtnl_lock();

netdev = __dev_get_by_index(genl_info_net(info), ifindex);
Expand Down Expand Up @@ -918,13 +919,15 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
goto err_unbind;

rtnl_unlock();
mutex_unlock(&priv->lock);

return 0;

err_unbind:
net_devmem_unbind_dmabuf(binding);
err_unlock:
rtnl_unlock();
mutex_unlock(&priv->lock);
err_genlmsg_free:
nlmsg_free(rsp);
return err;
Expand All @@ -933,18 +936,21 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
void netdev_nl_sock_priv_init(struct netdev_nl_sock *priv)
{
INIT_LIST_HEAD(&priv->bindings);
mutex_init(&priv->lock);
}

void netdev_nl_sock_priv_destroy(struct netdev_nl_sock *priv)
{
struct net_devmem_dmabuf_binding *binding;
struct net_devmem_dmabuf_binding *temp;

mutex_lock(&priv->lock);
list_for_each_entry_safe(binding, temp, &priv->bindings, list) {
rtnl_lock();
net_devmem_unbind_dmabuf(binding);
rtnl_unlock();
}
mutex_unlock(&priv->lock);
}

static int netdev_genl_netdevice_event(struct notifier_block *nb,
Expand Down

0 comments on commit 10eef09

Please sign in to comment.