How about the following approach? We mark with a flag the fact that
we're being called from ipoib_stop and in that case we do not attempt
to take the lock.




 drivers/infiniband/ulp/ipoib/ipoib.h           |    1 +
 drivers/infiniband/ulp/ipoib/ipoib_main.c      |    2 ++
 drivers/infiniband/ulp/ipoib/ipoib_multicast.c |    9 +++++++--
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h 
b/drivers/infiniband/ulp/ipoib/ipoib.h
index b0ffc9a..a2b5d8c 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -92,6 +92,7 @@ enum {
        IPOIB_FLAG_ADMIN_CM       = 9,
        IPOIB_FLAG_UMCAST         = 10,
        IPOIB_FLAG_CSUM           = 11,
+       IPOIB_FLAG_STOPPING       = 12,
 
        IPOIB_MAX_BACKOFF_SECONDS = 16,
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c 
b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index f51201b..008b674 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -151,6 +151,7 @@ static int ipoib_stop(struct net_device *dev)
 
        ipoib_dbg(priv, "stopping interface\n");
 
+       set_bit(IPOIB_FLAG_STOPPING, &priv->flags);
        clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
        napi_disable(&priv->napi);
 
@@ -182,6 +183,7 @@ static int ipoib_stop(struct net_device *dev)
                mutex_unlock(&priv->vlan_mutex);
        }
 
+       clear_bit(IPOIB_FLAG_STOPPING, &priv->flags);
        return 0;
 }
 
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c 
b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
index 8950e95..9b35188 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
@@ -576,9 +576,14 @@ void ipoib_mcast_join_task(struct work_struct *work)
        priv->mcast_mtu = 
IPOIB_UD_MTU(ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu));
 
        if (!ipoib_cm_admin_enabled(dev)) {
-               rtnl_lock();
+               int took_lock = 0;
+               if (!test_bit(IPOIB_FLAG_STOPPING, &priv->flags)) {
+                       rtnl_lock();
+                       took_lock = 1;
+               }
                dev_set_mtu(dev, min(priv->mcast_mtu, priv->admin_mtu));
-               rtnl_unlock();
+               if (took_lock)
+                       rtnl_unlock();
        }
 
        ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n");
-- 
1.5.6.5

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to