mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
net: get rid of rtnl_lock_unregistering()
After recent patches, and in particular commitsfaab39f63c("net: allow out-of-order netdev unregistration") ande5f80fcf86("ipv6: give an IPv6 dev to blackhole_netdev") we no longer need the barrier implemented in rtnl_lock_unregistering(). Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b3ae2d350d
commit
8a4fc54b07
|
|
@ -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)
|
||||||
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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user