Last user is gone after bdf5bd7f2132 "rds: tcp: remove
register_netdevice_notifier infrastructure.", so we can
remove this netdevice command. This allows to delete
rtnl_lock() in netdev_run_todo(), which is hot path for
net namespace unregistration.

dev_change_net_namespace() and netdev_wait_allrefs()
have rcu_barrier() before NETDEV_UNREGISTER_FINAL call,
and the source commits say they were introduced to
delemit the call with NETDEV_UNREGISTER, but this patch
leaves them on the places, since they require additional
analysis, whether we need in them for something else.

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 drivers/infiniband/hw/qedr/main.c |    4 ++--
 include/linux/netdevice.h         |    1 -
 include/rdma/ib_verbs.h           |    4 ++--
 net/core/dev.c                    |    6 ------
 4 files changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/infiniband/hw/qedr/main.c 
b/drivers/infiniband/hw/qedr/main.c
index db4bf97c0e15..eb32abb0099a 100644
--- a/drivers/infiniband/hw/qedr/main.c
+++ b/drivers/infiniband/hw/qedr/main.c
@@ -90,8 +90,8 @@ static struct net_device *qedr_get_netdev(struct ib_device 
*dev, u8 port_num)
        dev_hold(qdev->ndev);
 
        /* The HW vendor's device driver must guarantee
-        * that this function returns NULL before the net device reaches
-        * NETDEV_UNREGISTER_FINAL state.
+        * that this function returns NULL before the net device has finished
+        * NETDEV_UNREGISTER state.
         */
        return qdev->ndev;
 }
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index dd5a04c971d5..2a2d9cf50aa2 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2336,7 +2336,6 @@ enum netdev_cmd {
        NETDEV_PRE_TYPE_CHANGE,
        NETDEV_POST_TYPE_CHANGE,
        NETDEV_POST_INIT,
-       NETDEV_UNREGISTER_FINAL,
        NETDEV_RELEASE,
        NETDEV_NOTIFY_PEERS,
        NETDEV_JOIN,
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 73b2387e3f74..a1c5e8320f86 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -2126,8 +2126,8 @@ struct ib_device {
         * net device of device @device at port @port_num or NULL if such
         * a net device doesn't exist. The vendor driver should call dev_hold
         * on this net device. The HW vendor's device driver must guarantee
-        * that this function returns NULL before the net device reaches
-        * NETDEV_UNREGISTER_FINAL state.
+        * that this function returns NULL before the net device has finished
+        * NETDEV_UNREGISTER state.
         */
        struct net_device         *(*get_netdev)(struct ib_device *device,
                                                 u8 port_num);
diff --git a/net/core/dev.c b/net/core/dev.c
index bcc9fe68240b..c444da3e4b82 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -8086,7 +8086,6 @@ static void netdev_wait_allrefs(struct net_device *dev)
                        rcu_barrier();
                        rtnl_lock();
 
-                       call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
                        if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
                                     &dev->state)) {
                                /* We must not have linkwatch events
@@ -8158,10 +8157,6 @@ void netdev_run_todo(void)
                        = list_first_entry(&list, struct net_device, todo_list);
                list_del(&dev->todo_list);
 
-               rtnl_lock();
-               call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
-               __rtnl_unlock();
-
                if (unlikely(dev->reg_state != NETREG_UNREGISTERING)) {
                        pr_err("network todo '%s' but state %d\n",
                               dev->name, dev->reg_state);
@@ -8603,7 +8598,6 @@ int dev_change_net_namespace(struct net_device *dev, 
struct net *net, const char
         */
        call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
        rcu_barrier();
-       call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
 
        new_nsid = peernet2id_alloc(dev_net(dev), net);
        /* If there is an ifindex conflict assign a new one */

Reply via email to