aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/rtnetlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r--net/core/rtnetlink.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 2d3949789cef..e86b28482ca7 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -418,9 +418,11 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops)
418{ 418{
419 struct net *net; 419 struct net *net;
420 420
421 down_read(&net_rwsem);
421 for_each_net(net) { 422 for_each_net(net) {
422 __rtnl_kill_links(net, ops); 423 __rtnl_kill_links(net, ops);
423 } 424 }
425 up_read(&net_rwsem);
424 list_del(&ops->list); 426 list_del(&ops->list);
425} 427}
426EXPORT_SYMBOL_GPL(__rtnl_link_unregister); 428EXPORT_SYMBOL_GPL(__rtnl_link_unregister);
@@ -438,6 +440,9 @@ static void rtnl_lock_unregistering_all(void)
438 for (;;) { 440 for (;;) {
439 unregistering = false; 441 unregistering = false;
440 rtnl_lock(); 442 rtnl_lock();
443 /* We held write locked pernet_ops_rwsem, and parallel
444 * setup_net() and cleanup_net() are not possible.
445 */
441 for_each_net(net) { 446 for_each_net(net) {
442 if (net->dev_unreg_count > 0) { 447 if (net->dev_unreg_count > 0) {
443 unregistering = true; 448 unregistering = true;