This patch handles the corner case of running out of RC QPs. In that
case it switches to UD mode. This patch can be used both by NOSRQ and
SRQ code.

Changes from V1;
1. The switch to datagram mode conditionally happens only when there
no resources (QPs) available on the passive side.

This patch has been tested with linux-2.6.22-rc4 derived from Roland's
for-2.6.23 git tree on 06/11 on ppc64 machines


Signed-off-by: Pradeep Satyanarayana <[EMAIL PROTECTED]>
---

--- c/linux-2.6.22-rc4/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2007-06-12 12:35:07.000000000 -0400 +++ b/linux-2.6.22-rc4/drivers/infiniband/ulp/ipoib/ipoib_cm.c 2007-06-12 12:39:47.000000000 -0400
@@ -1378,8 +1378,18 @@ static int ipoib_cm_tx_handler(struct ib
                        ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED,
                                       NULL, 0, NULL, 0);
                break;
-       case IB_CM_REQ_ERROR:
        case IB_CM_REJ_RECEIVED:
+               ipoib_warn(priv, "REJ received\n");
+               spin_lock(&priv->lock);
+               neigh = tx->neigh;
+               spin_unlock(&priv->lock);
+               
+               if ((neigh) && (event->param.rej_rcvd.reason ==
+                  IB_CM_REJ_NO_QP)) {
+                       clear_bit(IPOIB_FLAG_OPER_UP, &neigh->cm->flags);
+                       break;
+               }
+       case IB_CM_REQ_ERROR:
        case IB_CM_TIMEWAIT_EXIT:
                ipoib_dbg(priv, "CM error %d.\n", event->event);
                spin_lock_irq(&priv->tx_lock);
--- c/linux-2.6.22-rc4/drivers/infiniband/ulp/ipoib/ipoib_main.c 2007-05-30 14:56:25.000000000 -0400 +++ b/linux-2.6.22-rc4/drivers/infiniband/ulp/ipoib/ipoib_main.c 2007-06-11 21:08:07.000000000 -0400
@@ -679,11 +679,10 @@ static int ipoib_start_xmit(struct sk_bu

                neigh = *to_ipoib_neigh(skb->dst->neighbour);

-               if (ipoib_cm_get(neigh)) {
-                       if (ipoib_cm_up(neigh)) {
+               if (ipoib_cm_get(neigh) &&  ipoib_cm_up(neigh) &&
+                       test_bit(IPOIB_FLAG_OPER_UP, &neigh->cm->flags)) {
                                ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
                                goto out;
-                       }
                } else if (neigh->ah) {
                        if (unlikely(memcmp(&neigh->dgid.raw,
                                            skb->dst->neighbour->ha + 4,

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to