When removing the ib_ipoib module, ipoib_ib_dev_stop() is
called and all address handles (ah) in the dead_ahs list are reaped.
However, some ah's may be still be added to the dead list by ipoib_mcast_free()
after ipoib_ib_dev_stop() is called. These ah's will not be freed.

The solution is to reap any remaining ah's after multicast device is really
flushed during cleanup.

Based on a recommendation by Yossi Etigin.
This fixes Bugzilla https://bugs.openfabrics.org/show_bug.cgi?id=1410

Signed-off-by: Vladimir Sokolovsky <[EMAIL PROTECTED]>
---
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c 
b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 66cafa2..2b77bbd 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -640,6 +640,25 @@ void ipoib_reap_ah(struct work_struct *work)
                                   round_jiffies_relative(HZ));
 }
 
+static void ipoib_ah_dev_cleanup(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       unsigned long begin;
+
+       begin = jiffies;
+
+       while (!list_empty(&priv->dead_ahs)) {
+               __ipoib_reap_ah(dev);
+
+               if (time_after(jiffies, begin + HZ)) {
+                       ipoib_warn(priv, "timing out; will leak address 
handles\n");
+                       break;
+               }
+
+               msleep(1);
+       }
+}
+
 static void ipoib_ib_tx_timer_func(unsigned long ctx)
 {
        drain_tx_cq((struct net_device *)ctx);
@@ -861,18 +880,7 @@ timeout:
        if (flush)
                flush_workqueue(ipoib_workqueue);
 
-       begin = jiffies;
-
-       while (!list_empty(&priv->dead_ahs)) {
-               __ipoib_reap_ah(dev);
-
-               if (time_after(jiffies, begin + HZ)) {
-                       ipoib_warn(priv, "timing out; will leak address 
handles\n");
-                       break;
-               }
-
-               msleep(1);
-       }
+       ipoib_ah_dev_cleanup(dev);
 
        ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
 
@@ -1005,6 +1013,7 @@ void ipoib_ib_dev_cleanup(struct net_device *dev)
        ipoib_mcast_stop_thread(dev, 1);
        ipoib_mcast_dev_flush(dev);
 
+       ipoib_ah_dev_cleanup(dev);
        ipoib_transport_dev_cleanup(dev);
 }
 
_______________________________________________
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