diff options
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_ib.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index 8406839b91cf..5033666b1481 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
| @@ -84,15 +84,9 @@ void ipoib_free_ah(struct kref *kref) | |||
| 84 | 84 | ||
| 85 | unsigned long flags; | 85 | unsigned long flags; |
| 86 | 86 | ||
| 87 | if ((int) priv->tx_tail - (int) ah->last_send >= 0) { | 87 | spin_lock_irqsave(&priv->lock, flags); |
| 88 | ipoib_dbg(priv, "Freeing ah %p\n", ah->ah); | 88 | list_add_tail(&ah->list, &priv->dead_ahs); |
| 89 | ib_destroy_ah(ah->ah); | 89 | spin_unlock_irqrestore(&priv->lock, flags); |
| 90 | kfree(ah); | ||
| 91 | } else { | ||
| 92 | spin_lock_irqsave(&priv->lock, flags); | ||
| 93 | list_add_tail(&ah->list, &priv->dead_ahs); | ||
| 94 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 95 | } | ||
| 96 | } | 90 | } |
| 97 | 91 | ||
| 98 | static int ipoib_ib_post_receive(struct net_device *dev, int id) | 92 | static int ipoib_ib_post_receive(struct net_device *dev, int id) |
| @@ -377,19 +371,16 @@ static void __ipoib_reap_ah(struct net_device *dev) | |||
| 377 | struct ipoib_ah *ah, *tah; | 371 | struct ipoib_ah *ah, *tah; |
| 378 | LIST_HEAD(remove_list); | 372 | LIST_HEAD(remove_list); |
| 379 | 373 | ||
| 380 | spin_lock_irq(&priv->lock); | 374 | spin_lock_irq(&priv->tx_lock); |
| 375 | spin_lock(&priv->lock); | ||
| 381 | list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list) | 376 | list_for_each_entry_safe(ah, tah, &priv->dead_ahs, list) |
| 382 | if ((int) priv->tx_tail - (int) ah->last_send >= 0) { | 377 | if ((int) priv->tx_tail - (int) ah->last_send >= 0) { |
| 383 | list_del(&ah->list); | 378 | list_del(&ah->list); |
| 384 | list_add_tail(&ah->list, &remove_list); | 379 | ib_destroy_ah(ah->ah); |
| 380 | kfree(ah); | ||
| 385 | } | 381 | } |
| 386 | spin_unlock_irq(&priv->lock); | 382 | spin_unlock(&priv->lock); |
| 387 | 383 | spin_unlock_irq(&priv->tx_lock); | |
| 388 | list_for_each_entry_safe(ah, tah, &remove_list, list) { | ||
| 389 | ipoib_dbg(priv, "Reaping ah %p\n", ah->ah); | ||
| 390 | ib_destroy_ah(ah->ah); | ||
| 391 | kfree(ah); | ||
| 392 | } | ||
| 393 | } | 384 | } |
| 394 | 385 | ||
| 395 | void ipoib_reap_ah(void *dev_ptr) | 386 | void ipoib_reap_ah(void *dev_ptr) |
