[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220218175856.2836878-1-eric.dumazet@gmail.com>
Date: Fri, 18 Feb 2022 09:58:56 -0800
From: Eric Dumazet <eric.dumazet@...il.com>
To: "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>
Cc: netdev <netdev@...r.kernel.org>,
Eric Dumazet <edumazet@...gle.com>,
Eric Dumazet <eric.dumazet@...il.com>
Subject: [PATCH net-next] net: get rid of rtnl_lock_unregistering()
From: Eric Dumazet <edumazet@...gle.com>
After recent patches, and in particular commits
faab39f63c1f ("net: allow out-of-order netdev unregistration") and
e5f80fcf869a ("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@...gle.com>
---
net/core/dev.c | 42 ------------------------------------------
1 file changed, 42 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index acd884910e12a040841e1e0525e0d4bc5e3ee799..a1190291c48e6cdb7fd20916793f72e2aac668cc 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -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)
{
/* 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);
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) {
for_each_netdev_reverse(net, dev) {
--
2.35.1.473.g83b2b277ed-goog
Powered by blists - more mailing lists