Commit 8a4fc54b authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net: get rid of rtnl_lock_unregistering()

After recent patches, and in particular commits
 faab39f6 ("net: allow out-of-order netdev unregistration") and
 e5f80fcf ("ipv6: give an IPv6 dev to blackhole_netdev")
we no longer need the barrier implemented in rtnl_lock_unregistering().
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b3ae2d35
...@@ -10884,36 +10884,6 @@ static void __net_exit default_device_exit_net(struct net *net) ...@@ -10884,36 +10884,6 @@ static void __net_exit default_device_exit_net(struct net *net)
} }
} }
static void __net_exit rtnl_lock_unregistering(struct list_head *net_list)
{
/* Return (with the rtnl_lock held) when there are no network
* devices unregistering in any network namespace in net_list.
*/
DEFINE_WAIT_FUNC(wait, woken_wake_function);
bool unregistering;
struct net *net;
ASSERT_RTNL();
add_wait_queue(&netdev_unregistering_wq, &wait);
for (;;) {
unregistering = false;
list_for_each_entry(net, net_list, exit_list) {
if (atomic_read(&net->dev_unreg_count) > 0) {
unregistering = true;
break;
}
}
if (!unregistering)
break;
__rtnl_unlock();
wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
rtnl_lock();
}
remove_wait_queue(&netdev_unregistering_wq, &wait);
}
static void __net_exit default_device_exit_batch(struct list_head *net_list) static void __net_exit default_device_exit_batch(struct list_head *net_list)
{ {
/* At exit all network devices most be removed from a network /* At exit all network devices most be removed from a network
...@@ -10930,18 +10900,6 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list) ...@@ -10930,18 +10900,6 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
default_device_exit_net(net); default_device_exit_net(net);
cond_resched(); cond_resched();
} }
/* To prevent network device cleanup code from dereferencing
* loopback devices or network devices that have been freed
* wait here for all pending unregistrations to complete,
* before unregistring the loopback device and allowing the
* network namespace be freed.
*
* The netdev todo list containing all network devices
* unregistrations that happen in default_device_exit_batch
* will run in the rtnl_unlock() at the end of
* default_device_exit_batch.
*/
rtnl_lock_unregistering(net_list);
list_for_each_entry(net, net_list, exit_list) { list_for_each_entry(net, net_list, exit_list) {
for_each_netdev_reverse(net, dev) { for_each_netdev_reverse(net, dev) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment