Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / drivers / infiniband / ulp / ipoib / ipoib_ib.c
index dcd996b..8406839 100644 (file)
@@ -84,9 +84,15 @@ void ipoib_free_ah(struct kref *kref)
 
        unsigned long flags;
 
-       spin_lock_irqsave(&priv->lock, flags);
-       list_add_tail(&ah->list, &priv->dead_ahs);
-       spin_unlock_irqrestore(&priv->lock, flags);
+       if ((int) priv->tx_tail - (int) ah->last_send >= 0) {
+               ipoib_dbg(priv, "Freeing ah %p\n", ah->ah);
+               ib_destroy_ah(ah->ah);
+               kfree(ah);
+       } else {
+               spin_lock_irqsave(&priv->lock, flags);
+               list_add_tail(&ah->list, &priv->dead_ahs);
+               spin_unlock_irqrestore(&priv->lock, flags);
+       }
 }
 
 static int ipoib_ib_post_receive(struct net_device *dev, int id)
@@ -371,16 +377,19 @@ static void __ipoib_reap_ah(struct net_device *dev)
        struct ipoib_ah *ah, *tah;
        LIST_HEAD(remove_list);
 
-       spin_lock_irq(&priv->tx_lock);
-       spin_lock(&priv->lock);
+       spin_lock_irq(&priv->lock);
        list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list)
                if ((int) priv->tx_tail - (int) ah->last_send >= 0) {
                        list_del(&ah->list);
-                       ib_destroy_ah(ah->ah);
-                       kfree(ah);
+                       list_add_tail(&ah->list, &remove_list);
                }
-       spin_unlock(&priv->lock);
-       spin_unlock_irq(&priv->tx_lock);
+       spin_unlock_irq(&priv->lock);
+
+       list_for_each_entry_safe(ah, tah, &remove_list, list) {
+               ipoib_dbg(priv, "Reaping ah %p\n", ah->ah);
+               ib_destroy_ah(ah->ah);
+               kfree(ah);
+       }
 }
 
 void ipoib_reap_ah(void *dev_ptr)
@@ -619,10 +628,8 @@ void ipoib_ib_dev_flush(void *_dev)
         * The device could have been brought down between the start and when
         * we get here, don't bring it back up if it's not configured up
         */
-       if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) {
+       if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
                ipoib_ib_dev_up(dev);
-               ipoib_mcast_restart_task(dev);
-       }
 
        mutex_lock(&priv->vlan_mutex);