IB/ipoib: Get rid of IPOIB_FLAG_GOING_DOWN
authorJason Gunthorpe <jgg@mellanox.com>
Sun, 29 Jul 2018 08:34:51 +0000 (11:34 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 3 Aug 2018 02:19:41 +0000 (20:19 -0600)
This essentially duplicates the netdev's reg_state, so just use that
directly. The reg_state is updated under the rntl_lock, and all places
using GOING_DOWN already acquire the rtnl_lock so checking is safe.

Since the only place we use GOING_DOWN is for the parent device this
does not fix any bugs, but it is a step to tidy up the unregister flow
so that after later patches the flow is uniform and sane.

Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_vlan.c

index e255a7e5a4c337ab41a29f6c7dd39074af417eb3..9eebb705d9945ba716dd10f273e8b96e184c709f 100644 (file)
@@ -95,7 +95,6 @@ enum {
        IPOIB_NEIGH_TBL_FLUSH     = 12,
        IPOIB_FLAG_DEV_ADDR_SET   = 13,
        IPOIB_FLAG_DEV_ADDR_CTRL  = 14,
-       IPOIB_FLAG_GOING_DOWN     = 15,
 
        IPOIB_MAX_BACKOFF_SECONDS = 16,
 
index 518313a1b0c9bbd83d13b673b16843d50f0250bc..16ea08dc59a8d93eac137bb8b30abf39c1358eaf 100644 (file)
@@ -1519,9 +1519,6 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
        int ret;
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
 
-       if (test_bit(IPOIB_FLAG_GOING_DOWN, &priv->flags))
-               return -EPERM;
-
        if (!mutex_trylock(&priv->sysfs_mutex))
                return restart_syscall();
 
@@ -1530,6 +1527,12 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
                return restart_syscall();
        }
 
+       if (dev->reg_state != NETREG_REGISTERED) {
+               rtnl_unlock();
+               mutex_unlock(&priv->sysfs_mutex);
+               return -EPERM;
+       }
+
        ret = ipoib_set_mode(dev, buf);
 
        /* The assumption is that the function ipoib_set_mode returned
index 82f0e3869b0476dcd82c3a9e1a73acbd46bc523e..7ca9013bf05c60ffe697575c43088fafe00570c8 100644 (file)
@@ -2406,9 +2406,6 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data)
                ib_unregister_event_handler(&priv->event_handler);
                flush_workqueue(ipoib_workqueue);
 
-               /* mark interface in the middle of destruction */
-               set_bit(IPOIB_FLAG_GOING_DOWN, &priv->flags);
-
                rtnl_lock();
                dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP);
                rtnl_unlock();
index b067ad5e4c7e595795fa6bbdbc2d99d04e27d45f..1b7bfd500893785491728d328e819bb6e15a170d 100644 (file)
@@ -127,9 +127,6 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
 
        ppriv = ipoib_priv(pdev);
 
-       if (test_bit(IPOIB_FLAG_GOING_DOWN, &ppriv->flags))
-               return -EPERM;
-
        snprintf(intf_name, sizeof(intf_name), "%s.%04x",
                 ppriv->dev->name, pkey);
 
@@ -141,6 +138,12 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
                return restart_syscall();
        }
 
+       if (pdev->reg_state != NETREG_REGISTERED) {
+               rtnl_unlock();
+               mutex_unlock(&ppriv->sysfs_mutex);
+               return -EPERM;
+       }
+
        if (!down_write_trylock(&ppriv->vlan_rwsem)) {
                rtnl_unlock();
                mutex_unlock(&ppriv->sysfs_mutex);
@@ -199,9 +202,6 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
 
        ppriv = ipoib_priv(pdev);
 
-       if (test_bit(IPOIB_FLAG_GOING_DOWN, &ppriv->flags))
-               return -EPERM;
-
        if (!mutex_trylock(&ppriv->sysfs_mutex))
                return restart_syscall();
 
@@ -210,6 +210,12 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
                return restart_syscall();
        }
 
+       if (pdev->reg_state != NETREG_REGISTERED) {
+               rtnl_unlock();
+               mutex_unlock(&ppriv->sysfs_mutex);
+               return -EPERM;
+       }
+
        if (!down_write_trylock(&ppriv->vlan_rwsem)) {
                rtnl_unlock();
                mutex_unlock(&ppriv->sysfs_mutex);