Modify the kernel rdma cm use the ipoib broadcast group qkey instead a qkey of 
its
own for its UD IDs/QPs. For RDMA_PS_UDP ID, the qkey is stored in struct 
rdma_id_private
and delivered also in ADDR_RESOLVED and CONNECT_REQUEST events. The user space 
library
learns the qkey from these events and use them when it is called to create UD 
QP.

Signed-off-by: Or Gerlitz <[EMAIL PROTECTED]>

Index: rdma-dev/drivers/infiniband/core/cma.c
===================================================================
--- rdma-dev.orig/drivers/infiniband/core/cma.c 2007-01-21 12:11:16.000000000 
+0200
+++ rdma-dev/drivers/infiniband/core/cma.c      2007-01-22 21:52:30.000000000 
+0200
@@ -136,6 +136,7 @@ struct rdma_id_private {
        u32                     seq_num;
        u32                     qp_num;
        u8                      srq;
+       u32                     qkey;
 };

 struct cma_multicast {
@@ -884,6 +885,21 @@ out:
        return ret;
 }

+static int get_broadcast_group_qkey(struct rdma_id_private *id_priv)
+{
+       struct ib_sa_mcmember_rec rec;
+       struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
+       int ret;
+
+       ib_addr_get_mgid(dev_addr, &rec.mgid);
+       ret = ib_sa_get_mcmember_rec(id_priv->id.device, id_priv->id.port_num,
+                                    &rec.mgid, &rec);
+       if (ret)
+               return -EINVAL;
+       id_priv->qkey = rec.qkey;
+       return 0;
+}
+
 static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
                                               struct ib_cm_event *ib_event)
 {
@@ -1020,7 +1036,14 @@ static int cma_req_handler(struct ib_cm_
        mutex_unlock(&lock);
        if (ret)
                goto release_conn_id;
-
+
+       if (conn_id->id.ps == RDMA_PS_UDP) {
+               ret = get_broadcast_group_qkey(conn_id);
+               if (ret)
+                       goto release_conn_id;
+               event.param.ud.qkey = conn_id->qkey;
+       }
+
        conn_id->cm_id.ib = cm_id;
        cm_id->context = conn_id;
        cm_id->cm_handler = cma_ib_handler;
@@ -1600,6 +1623,7 @@ static void addr_handler(int status, str
 {
        struct rdma_id_private *id_priv = context;
        struct rdma_cm_event event;
+       int ret;

        memset(&event, 0, sizeof event);
        atomic_inc(&id_priv->dev_remove);
@@ -1627,6 +1651,14 @@ static void addr_handler(int status, str
                memcpy(&id_priv->id.route.addr.src_addr, src_addr,
                       ip_addr_size(src_addr));
                event.event = RDMA_CM_EVENT_ADDR_RESOLVED;
+               if (id_priv->id.ps == RDMA_PS_UDP) {
+                       ret = get_broadcast_group_qkey(id_priv);
+                       if (ret) {
+                               event.event = RDMA_CM_EVENT_ADDR_ERROR;
+                               event.status = ret;
+                       } else
+                               event.param.ud.qkey = id_priv->qkey;
+               }
        }

        if (id_priv->id.event_handler(&id_priv->id, &event)) {
@@ -1936,7 +1968,9 @@ static int cma_sidr_rep_handler(struct i
                        event.status = ib_event->param.sidr_rep_rcvd.status;
                        break;
                }
-               if (rep->qkey != RDMA_UD_QKEY) {
+               if (rep->qkey != id_priv->qkey) {
+                       printk(KERN_WARNING "qkey mismatch %.8x client qkey 
%.8x\n",
+                               rep->qkey, id_priv->qkey);
                        event.event = RDMA_CM_EVENT_UNREACHABLE;
                        event.status = -EINVAL;
                        break;
@@ -2231,7 +2265,7 @@ static int cma_send_sidr_rep(struct rdma
        rep.status = status;
        if (status == IB_SIDR_SUCCESS) {
                rep.qp_num = id_priv->qp_num;
-               rep.qkey = RDMA_UD_QKEY;
+               rep.qkey = id_priv->qkey;
        }
        rep.private_data = private_data;
        rep.private_data_len = private_data_len;
Index: rdma-dev/include/rdma/rdma_cm_ib.h
===================================================================
--- rdma-dev.orig/include/rdma/rdma_cm_ib.h     2007-01-18 13:43:37.000000000 
+0200
+++ rdma-dev/include/rdma/rdma_cm_ib.h  2007-01-22 21:59:34.000000000 +0200
@@ -44,7 +44,4 @@
 int rdma_set_ib_paths(struct rdma_cm_id *id,
                      struct ib_sa_path_rec *path_rec, int num_paths);

-/* Global qkey for UD QPs and multicast groups. */
-#define RDMA_UD_QKEY 0x01234567
-
 #endif /* RDMA_CM_IB_H */


_______________________________________________
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

Reply via email to