Commit e51b9624 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: remove dev_base_lock from register_netdevice() and friends.



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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2dd4d828
Loading
Loading
Loading
Loading
+7 −13
Original line number Diff line number Diff line
@@ -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,12 +427,10 @@ 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);
	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);

	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();