diff options
author | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-01 16:43:06 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-01 16:43:06 -0800 |
commit | 5f56bbdf1e35d41b4b3d4c92bdb3e70c63877e4d (patch) | |
tree | 90d2606b1a12b2a01f8527c7daedada650fea854 /drivers/infiniband/ulp/ipoib/ipoib_main.c | |
parent | 9641219825a54249d77d7aa1afa7d874a05c7f90 (diff) | |
parent | f469b2626f48829c06e40ac799c1edf62b12048e (diff) | |
download | op-kernel-dev-5f56bbdf1e35d41b4b3d4c92bdb3e70c63877e4d.zip op-kernel-dev-5f56bbdf1e35d41b4b3d4c92bdb3e70c63877e4d.tar.gz |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (25 commits)
IB/ucm: Fix deadlock in cleanup
IB/cm: Fix automatic path migration support
IPoIB: Fix skb leak when freeing neighbour
IB/srp: Fix memory leak on reconnect
RDMA/addr: list_move() cleanups
RDMA/addr: Fix some cancellation problems in process_req()
RDMA/amso1100: Prevent deadlock in destroy QP
IB/mthca: Fix initial SRQ logsize for mem-free HCAs
IB/ehca: Use WQE offset instead of WQE addr for pending work reqs
RDMA/iwcm: Fix comment for iwcm_deref_id() to match code
RDMA/iwcm: Remove unnecessary function argument
RDMA/iwcm: Remove unnecessary initializations
RDMA/iwcm: Fix memory leak
RDMA/iwcm: Fix memory corruption bug in cm_work_handler()
IB: Convert kmem_cache_t -> struct kmem_cache
IB/ipath: Fix typo in pma_counter_select subscript
RDMA/amso1100: Fix section mismatches
IB/mthca: Fix section mismatches
IB/srp: Increase supported CDB size
RDMA/cm: Remove setting local write as part of QP access flags
...
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_main.c')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 85522da..5ba3154 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -264,7 +264,7 @@ static void path_free(struct net_device *dev, struct ipoib_path *path) if (neigh->ah) ipoib_put_ah(neigh->ah); - ipoib_neigh_free(neigh); + ipoib_neigh_free(dev, neigh); } spin_unlock_irqrestore(&priv->lock, flags); @@ -525,10 +525,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); } else { neigh->ah = NULL; - __skb_queue_tail(&neigh->queue, skb); if (!path->query && path_rec_start(dev, path)) goto err_list; + + __skb_queue_tail(&neigh->queue, skb); } spin_unlock(&priv->lock); @@ -538,7 +539,7 @@ err_list: list_del(&neigh->list); err_path: - ipoib_neigh_free(neigh); + ipoib_neigh_free(dev, neigh); ++priv->stats.tx_dropped; dev_kfree_skb_any(skb); @@ -655,7 +656,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) */ ipoib_put_ah(neigh->ah); list_del(&neigh->list); - ipoib_neigh_free(neigh); + ipoib_neigh_free(dev, neigh); spin_unlock(&priv->lock); ipoib_path_lookup(skb, dev); goto out; @@ -786,7 +787,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) if (neigh->ah) ah = neigh->ah; list_del(&neigh->list); - ipoib_neigh_free(neigh); + ipoib_neigh_free(n->dev, neigh); } spin_unlock_irqrestore(&priv->lock, flags); @@ -809,9 +810,15 @@ struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour) return neigh; } -void ipoib_neigh_free(struct ipoib_neigh *neigh) +void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) { + struct ipoib_dev_priv *priv = netdev_priv(dev); + struct sk_buff *skb; *to_ipoib_neigh(neigh->neighbour) = NULL; + while ((skb = __skb_dequeue(&neigh->queue))) { + ++priv->stats.tx_dropped; + dev_kfree_skb_any(skb); + } kfree(neigh); } |