Merge branches 'cxgb4', 'ipoib', 'misc' and 'qib' into for-next
This commit is contained in:
@@ -57,21 +57,24 @@ struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
|
||||
struct ib_pd *pd, struct ib_ah_attr *attr)
|
||||
{
|
||||
struct ipoib_ah *ah;
|
||||
struct ib_ah *vah;
|
||||
|
||||
ah = kmalloc(sizeof *ah, GFP_KERNEL);
|
||||
if (!ah)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ah->dev = dev;
|
||||
ah->last_send = 0;
|
||||
kref_init(&ah->ref);
|
||||
|
||||
ah->ah = ib_create_ah(pd, attr);
|
||||
if (IS_ERR(ah->ah)) {
|
||||
vah = ib_create_ah(pd, attr);
|
||||
if (IS_ERR(vah)) {
|
||||
kfree(ah);
|
||||
ah = NULL;
|
||||
} else
|
||||
ah = (struct ipoib_ah *)vah;
|
||||
} else {
|
||||
ah->ah = vah;
|
||||
ipoib_dbg(netdev_priv(dev), "Created ah %p\n", ah->ah);
|
||||
}
|
||||
|
||||
return ah;
|
||||
}
|
||||
|
@@ -432,7 +432,7 @@ static void path_rec_completion(int status,
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
if (ah) {
|
||||
if (!IS_ERR_OR_NULL(ah)) {
|
||||
path->pathrec = *pathrec;
|
||||
|
||||
old_ah = path->ah;
|
||||
@@ -555,6 +555,7 @@ static int path_rec_start(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* called with rcu_read_lock */
|
||||
static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
@@ -636,6 +637,7 @@ err_drop:
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
/* called with rcu_read_lock */
|
||||
static void ipoib_path_lookup(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(skb->dev);
|
||||
@@ -720,13 +722,14 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct neighbour *n = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
rcu_read_lock();
|
||||
if (likely(skb_dst(skb)))
|
||||
n = dst_get_neighbour(skb_dst(skb));
|
||||
|
||||
if (likely(n)) {
|
||||
if (unlikely(!*to_ipoib_neigh(n))) {
|
||||
ipoib_path_lookup(skb, dev);
|
||||
return NETDEV_TX_OK;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
neigh = *to_ipoib_neigh(n);
|
||||
@@ -749,17 +752,17 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
ipoib_neigh_free(dev, neigh);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_path_lookup(skb, dev);
|
||||
return NETDEV_TX_OK;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (ipoib_cm_get(neigh)) {
|
||||
if (ipoib_cm_up(neigh)) {
|
||||
ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
|
||||
return NETDEV_TX_OK;
|
||||
goto unlock;
|
||||
}
|
||||
} else if (neigh->ah) {
|
||||
ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(n->ha));
|
||||
return NETDEV_TX_OK;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
|
||||
@@ -793,13 +796,14 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
phdr->hwaddr + 4);
|
||||
dev_kfree_skb_any(skb);
|
||||
++dev->stats.tx_dropped;
|
||||
return NETDEV_TX_OK;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
unicast_arp_send(skb, dev, phdr);
|
||||
}
|
||||
}
|
||||
|
||||
unlock:
|
||||
rcu_read_unlock();
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -837,7 +841,7 @@ static int ipoib_hard_header(struct sk_buff *skb,
|
||||
dst = skb_dst(skb);
|
||||
n = NULL;
|
||||
if (dst)
|
||||
n = dst_get_neighbour(dst);
|
||||
n = dst_get_neighbour_raw(dst);
|
||||
if ((!dst || !n) && daddr) {
|
||||
struct ipoib_pseudoheader *phdr =
|
||||
(struct ipoib_pseudoheader *) skb_push(skb, sizeof *phdr);
|
||||
|
@@ -240,8 +240,11 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
|
||||
av.grh.dgid = mcast->mcmember.mgid;
|
||||
|
||||
ah = ipoib_create_ah(dev, priv->pd, &av);
|
||||
if (!ah) {
|
||||
ipoib_warn(priv, "ib_address_create failed\n");
|
||||
if (IS_ERR(ah)) {
|
||||
ipoib_warn(priv, "ib_address_create failed %ld\n",
|
||||
-PTR_ERR(ah));
|
||||
/* use original error */
|
||||
return PTR_ERR(ah);
|
||||
} else {
|
||||
spin_lock_irq(&priv->lock);
|
||||
mcast->ah = ah;
|
||||
@@ -266,7 +269,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
|
||||
|
||||
skb->dev = dev;
|
||||
if (dst)
|
||||
n = dst_get_neighbour(dst);
|
||||
n = dst_get_neighbour_raw(dst);
|
||||
if (!dst || !n) {
|
||||
/* put pseudoheader back on for next time */
|
||||
skb_push(skb, sizeof (struct ipoib_pseudoheader));
|
||||
@@ -722,6 +725,8 @@ out:
|
||||
if (mcast && mcast->ah) {
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct neighbour *n = NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
if (dst)
|
||||
n = dst_get_neighbour(dst);
|
||||
if (n && !*to_ipoib_neigh(n)) {
|
||||
@@ -734,7 +739,7 @@ out:
|
||||
list_add_tail(&neigh->list, &mcast->neigh_list);
|
||||
}
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN);
|
||||
return;
|
||||
|
Reference in New Issue
Block a user