|
@@ -604,8 +604,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
|
|
|
skb_queue_len(&neigh->queue));
|
|
|
goto err_drop;
|
|
|
}
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb_dst(skb)->neighbour->ha));
|
|
|
+ return;
|
|
|
+ }
|
|
|
} else {
|
|
|
neigh->ah = NULL;
|
|
|
|
|
@@ -688,7 +691,9 @@ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
|
|
|
ipoib_dbg(priv, "Send unicast ARP to %04x\n",
|
|
|
be16_to_cpu(path->pathrec.dlid));
|
|
|
|
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr));
|
|
|
+ return;
|
|
|
} else if ((path->query || !path_rec_start(dev, path)) &&
|
|
|
skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
|
|
/* put pseudoheader back on for next time */
|