|
@@ -517,7 +517,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
|
|
|
struct ipoib_path *path;
|
|
|
struct ipoib_neigh *neigh;
|
|
|
|
|
|
- neigh = ipoib_neigh_alloc(skb->dst->neighbour);
|
|
|
+ neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
|
|
|
if (!neigh) {
|
|
|
++dev->stats.tx_dropped;
|
|
|
dev_kfree_skb_any(skb);
|
|
@@ -817,6 +817,13 @@ static void ipoib_neigh_cleanup(struct neighbour *n)
|
|
|
unsigned long flags;
|
|
|
struct ipoib_ah *ah = NULL;
|
|
|
|
|
|
+ neigh = *to_ipoib_neigh(n);
|
|
|
+ if (neigh) {
|
|
|
+ priv = netdev_priv(neigh->dev);
|
|
|
+ ipoib_dbg(priv, "neigh_destructor for bonding device: %s\n",
|
|
|
+ n->dev->name);
|
|
|
+ } else
|
|
|
+ return;
|
|
|
ipoib_dbg(priv,
|
|
|
"neigh_cleanup for %06x " IPOIB_GID_FMT "\n",
|
|
|
IPOIB_QPN(n->ha),
|
|
@@ -824,13 +831,10 @@ static void ipoib_neigh_cleanup(struct neighbour *n)
|
|
|
|
|
|
spin_lock_irqsave(&priv->lock, flags);
|
|
|
|
|
|
- neigh = *to_ipoib_neigh(n);
|
|
|
- if (neigh) {
|
|
|
- if (neigh->ah)
|
|
|
- ah = neigh->ah;
|
|
|
- list_del(&neigh->list);
|
|
|
- ipoib_neigh_free(n->dev, neigh);
|
|
|
- }
|
|
|
+ if (neigh->ah)
|
|
|
+ ah = neigh->ah;
|
|
|
+ list_del(&neigh->list);
|
|
|
+ ipoib_neigh_free(n->dev, neigh);
|
|
|
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
|
|
@@ -838,7 +842,8 @@ static void ipoib_neigh_cleanup(struct neighbour *n)
|
|
|
ipoib_put_ah(ah);
|
|
|
}
|
|
|
|
|
|
-struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour)
|
|
|
+struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour,
|
|
|
+ struct net_device *dev)
|
|
|
{
|
|
|
struct ipoib_neigh *neigh;
|
|
|
|
|
@@ -847,6 +852,7 @@ struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour)
|
|
|
return NULL;
|
|
|
|
|
|
neigh->neighbour = neighbour;
|
|
|
+ neigh->dev = dev;
|
|
|
*to_ipoib_neigh(neighbour) = neigh;
|
|
|
skb_queue_head_init(&neigh->queue);
|
|
|
ipoib_cm_set(neigh, NULL);
|