Roland Dreier wrote: > The IPoIB drops multicast packets if more than 3 are queued while a > multicast send is pending. The send queue can easily contain more > than 3 packets and when the queue is processed only the first 3 > packets will make it and the rest will be dropped.
If we go this way, I went and did the same thing for unicast, patch below. Alternatively we may have both mcast/unicast queues to remain and get their length set by the net.ipvY.neigh.ibX.unres_qlen? I tested my patch with TCP/UDP netperf/iperf over 2.6.29.1 and things seem to work fine. Or. This patch applies the same reasoning and method of "IPoIB: Don't drop multicast packets sent before group is joined" to unicast packets. Signed-off-by: Or Gerlitz <ogerl...@voltaire.com> Index: linus-linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h =================================================================== --- linus-linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h +++ linus-linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h @@ -78,8 +78,6 @@ enum { IPOIB_NUM_WC = 4, - IPOIB_MAX_PATH_REC_QUEUE = 3, - IPOIB_FLAG_OPER_UP = 0, IPOIB_FLAG_INITIALIZED = 1, IPOIB_FLAG_ADMIN_UP = 2, Index: linus-linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c =================================================================== --- linus-linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ linus-linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -597,13 +597,7 @@ static void neigh_add_path(struct sk_buf ipoib_neigh_free(dev, neigh); goto err_drop; } - if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) - __skb_queue_tail(&neigh->queue, skb); - else { - ipoib_warn(priv, "queue length limit %d. Packet drop.\n", - skb_queue_len(&neigh->queue)); - goto err_drop; - } + __skb_queue_tail(&neigh->queue, skb); } else ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); } else { @@ -689,8 +683,7 @@ static void unicast_arp_send(struct sk_b be16_to_cpu(path->pathrec.dlid)); ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr)); - } else if ((path->query || !path_rec_start(dev, path)) && - skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) { + } else if (path->query || !path_rec_start(dev, path)) { /* put pseudoheader back on for next time */ skb_push(skb, sizeof *phdr); __skb_queue_tail(&path->queue, skb); @@ -747,14 +740,9 @@ static int ipoib_start_xmit(struct sk_bu return NETDEV_TX_OK; } - if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) { - spin_lock_irqsave(&priv->lock, flags); - __skb_queue_tail(&neigh->queue, skb); - spin_unlock_irqrestore(&priv->lock, flags); - } else { - ++dev->stats.tx_dropped; - dev_kfree_skb_any(skb); - } + spin_lock_irqsave(&priv->lock, flags); + __skb_queue_tail(&neigh->queue, skb); + spin_unlock_irqrestore(&priv->lock, flags); } else { struct ipoib_pseudoheader *phdr = (struct ipoib_pseudoheader *) skb->data; _______________________________________________ general mailing list general@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general