net: remove dev_base_lock from register_netdevice() and friends.
authorEric Dumazet <edumazet@google.com>
Tue, 13 Feb 2024 06:32:44 +0000 (06:32 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Feb 2024 11:20:14 +0000 (11:20 +0000)
RTNL already protects writes to dev->reg_state, we no longer need to hold
dev_base_lock to protect the readers.

unlist_netdevice() second argument can be removed.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 26f93446b743e91528cf788cf861dd947fc16023..02cf9fd68da6372194934eabbcec1c6f1ca2ba12 100644 (file)
@@ -414,7 +414,7 @@ static void list_netdevice(struct net_device *dev)
 /* Device list removal
  * caller must respect a RCU grace period before freeing/reusing dev
  */
-static void unlist_netdevice(struct net_device *dev, bool lock)
+static void unlist_netdevice(struct net_device *dev)
 {
        struct netdev_name_node *name_node;
        struct net *net = dev_net(dev);
@@ -427,13 +427,11 @@ static void unlist_netdevice(struct net_device *dev, bool lock)
                netdev_name_node_del(name_node);
 
        /* Unlink dev from the device chain */
-       if (lock)
-               write_lock(&dev_base_lock);
+       write_lock(&dev_base_lock);
        list_del_rcu(&dev->dev_list);
        netdev_name_node_del(dev->name_node);
        hlist_del_rcu(&dev->index_hlist);
-       if (lock)
-               write_unlock(&dev_base_lock);
+       write_unlock(&dev_base_lock);
 
        dev_base_seq_inc(dev_net(dev));
 }
@@ -10338,9 +10336,9 @@ int register_netdevice(struct net_device *dev)
                goto err_ifindex_release;
 
        ret = netdev_register_kobject(dev);
-       write_lock(&dev_base_lock);
+
        WRITE_ONCE(dev->reg_state, ret ? NETREG_UNREGISTERED : NETREG_REGISTERED);
-       write_unlock(&dev_base_lock);
+
        if (ret)
                goto err_uninit_notify;
 
@@ -10629,9 +10627,7 @@ void netdev_run_todo(void)
                        continue;
                }
 
-               write_lock(&dev_base_lock);
                WRITE_ONCE(dev->reg_state, NETREG_UNREGISTERED);
-               write_unlock(&dev_base_lock);
                linkwatch_sync_dev(dev);
        }
 
@@ -11138,10 +11134,8 @@ void unregister_netdevice_many_notify(struct list_head *head,
 
        list_for_each_entry(dev, head, unreg_list) {
                /* And unlink it from device chain. */
-               write_lock(&dev_base_lock);
-               unlist_netdevice(dev, false);
+               unlist_netdevice(dev);
                WRITE_ONCE(dev->reg_state, NETREG_UNREGISTERING);
-               write_unlock(&dev_base_lock);
        }
        flush_all_backlogs();
 
@@ -11323,7 +11317,7 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
        dev_close(dev);
 
        /* And unlink it from device chain */
-       unlist_netdevice(dev, true);
+       unlist_netdevice(dev);
 
        synchronize_net();