[PATCH NET-PREV 16/51] geneve: Use __register_netdevice in .newlink
From: Kirill Tkhai
Date: Sat Mar 22 2025 - 11:02:48 EST
The objective is to conform .newlink with its callers,
which already assign nd_lock (and matches master nd_lock
if there is one).
Signed-off-by: Kirill Tkhai <tkhai@xxxxx>
---
drivers/net/geneve.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index 838e85ddec67..f74f92753063 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -1380,7 +1380,7 @@ static int geneve_configure(struct net *net, struct net_device *dev,
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
}
- err = register_netdevice(dev);
+ err = __register_netdevice(dev);
if (err)
return err;
@@ -1830,6 +1830,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
u8 name_assign_type, u16 dst_port)
{
struct nlattr *tb[IFLA_MAX + 1];
+ struct nd_lock *nd_lock;
struct net_device *dev;
LIST_HEAD(list_kill);
int err;
@@ -1846,12 +1847,21 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
if (IS_ERR(dev))
return dev;
+ if (!attach_new_nd_lock(dev)) {
+ free_netdev(dev);
+ return ERR_PTR(-ENOMEM);
+ }
+
init_tnl_info(&cfg.info, dst_port);
+ lock_netdev(dev, &nd_lock);
err = geneve_configure(net, dev, NULL, &cfg);
if (err) {
+ detach_nd_lock(dev);
+ unlock_netdev(nd_lock);
free_netdev(dev);
return ERR_PTR(err);
}
+ unlock_netdev(nd_lock);
/* openvswitch users expect packet sizes to be unrestricted,
* so set the largest MTU we can.