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

Reply via email to