There is a race in IPoIB where it rearms the CQ by calling ib_req_notify_cq() followed by ib_poll_cq(). The loop can call ib_poll_cq() multiple times if new packets arrive but then fail to rearm the CQ properly.
Signed-off-by: Ralph Campbell <[EMAIL PROTECTED]> Index: openib/src/linux-kernel/infiniband/ulp/ipoib/ipoib_ib.c =================================================================== --- openib/src/linux-kernel/infiniband/ulp/ipoib/ipoib_ib.c (revision 5870) +++ openib/src/linux-kernel/infiniband/ulp/ipoib/ipoib_ib.c (working copy) @@ -292,13 +292,20 @@ struct net_device *dev = (struct net_device *) dev_ptr; struct ipoib_dev_priv *priv = netdev_priv(dev); int n, i; + int retry = 1; - ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); - do { + while (1) { n = ib_poll_cq(cq, IPOIB_NUM_WC, priv->ibwc); for (i = 0; i < n; ++i) ipoib_ib_handle_wc(dev, priv->ibwc + i); - } while (n == IPOIB_NUM_WC); + if (n <= 0) { + if (!retry) + break; + ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + retry = 0; + } else + retry = 1; + } } static inline int post_send(struct ipoib_dev_priv *priv, _______________________________________________ openib-general mailing list openib-general@openib.org http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general