We need to know the QP type separately from the port space.  In
order to support XRC, UC, and other QP types, we use RDMA_PS_IB,
which no longer provides a 1:1 mapping between the port space
and QP type.

Signed-off-by: Sean Hefty <[email protected]>
---
The general framework for this is already in the code.  We just
need to clean up a couple of areas.

 include/rdma/rdma_cma.h |    1 +
 src/cma.c               |   23 +++++++++++++----------
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/include/rdma/rdma_cma.h b/include/rdma/rdma_cma.h
index 799a295..3b40060 100755
--- a/include/rdma/rdma_cma.h
+++ b/include/rdma/rdma_cma.h
@@ -127,6 +127,7 @@ struct rdma_cm_id {
        struct ibv_cq           *recv_cq;
        struct ibv_srq          *srq;
        struct ibv_pd           *pd;
+       enum ibv_qp_type        qp_type;
 };
 
 enum {
diff --git a/src/cma.c b/src/cma.c
index e068125..eb339c9 100755
--- a/src/cma.c
+++ b/src/cma.c
@@ -410,7 +410,8 @@ static void ucma_free_id(struct cma_id_private *id_priv)
 
 static struct cma_id_private *ucma_alloc_id(struct rdma_event_channel *channel,
                                            void *context,
-                                           enum rdma_port_space ps)
+                                           enum rdma_port_space ps,
+                                           enum ibv_qp_type qp_type)
 {
        struct cma_id_private *id_priv;
 
@@ -420,6 +421,7 @@ static struct cma_id_private *ucma_alloc_id(struct 
rdma_event_channel *channel,
 
        id_priv->id.context = context;
        id_priv->id.ps = ps;
+       id_priv->id.qp_type = qp_type;
 
        if (!channel) {
                id_priv->id.channel = rdma_create_event_channel();
@@ -454,7 +456,7 @@ static int rdma_create_id2(struct rdma_event_channel 
*channel,
        if (ret)
                return ret;
 
-       id_priv = ucma_alloc_id(channel, context, ps);
+       id_priv = ucma_alloc_id(channel, context, ps, qp_type);
        if (!id_priv)
                return ERR(ENOMEM);
 
@@ -920,9 +922,9 @@ out:
        return ucma_complete(id_priv);
 }
 
-static int ucma_is_ud_ps(enum rdma_port_space ps)
+static int ucma_is_ud_qp(enum ibv_qp_type qp_type)
 {
-       return (ps == RDMA_PS_UDP || ps == RDMA_PS_IPOIB);
+       return (qp_type == IBV_QPT_UD);
 }
 
 static int rdma_init_qp_attr(struct rdma_cm_id *id, struct ibv_qp_attr 
*qp_attr,
@@ -1249,7 +1251,7 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd 
*pd,
                goto err1;
        }
 
-       if (ucma_is_ud_ps(id->ps))
+       if (ucma_is_ud_qp(id->qp_type))
                ret = ucma_init_ud_qp(id_priv, qp);
        else
                ret = ucma_init_conn_qp(id_priv, qp);
@@ -1472,7 +1474,7 @@ int rdma_accept(struct rdma_cm_id *id, struct 
rdma_conn_param *conn_param)
                id_priv->responder_resources = conn_param->responder_resources;
        }
 
-       if (!ucma_is_ud_ps(id->ps)) {
+       if (!ucma_is_ud_qp(id->qp_type)) {
                ret = ucma_modify_qp_rtr(id, id_priv->responder_resources);
                if (ret)
                        return ret;
@@ -1801,7 +1803,8 @@ static int ucma_process_conn_req(struct cma_event *evt,
        int ret;
 
        id_priv = ucma_alloc_id(evt->id_priv->id.channel,
-                               evt->id_priv->id.context, evt->id_priv->id.ps);
+                               evt->id_priv->id.context, evt->id_priv->id.ps,
+                               evt->id_priv->id.qp_type);
        if (!id_priv) {
                ucma_destroy_kern_id(evt->id_priv->id.channel->fd, handle);
                ret = ERR(ENOMEM);
@@ -1957,7 +1960,7 @@ retry:
                break;
        case RDMA_CM_EVENT_CONNECT_REQUEST:
                evt->id_priv = (void *) (uintptr_t) resp->uid;
-               if (ucma_is_ud_ps(evt->id_priv->id.ps))
+               if (ucma_is_ud_qp(evt->id_priv->id.qp_type))
                        ucma_copy_ud_event(evt, &resp->param.ud);
                else
                        ucma_copy_conn_event(evt, &resp->param.conn);
@@ -1977,7 +1980,7 @@ retry:
                }
                break;
        case RDMA_CM_EVENT_ESTABLISHED:
-               if (ucma_is_ud_ps(evt->id_priv->id.ps)) {
+               if (ucma_is_ud_qp(evt->id_priv->id.qp_type)) {
                        ucma_copy_ud_event(evt, &resp->param.ud);
                        break;
                }
@@ -2019,7 +2022,7 @@ retry:
                evt->id_priv = (void *) (uintptr_t) resp->uid;
                evt->event.id = &evt->id_priv->id;
                evt->event.status = resp->status;
-               if (ucma_is_ud_ps(evt->id_priv->id.ps))
+               if (ucma_is_ud_qp(evt->id_priv->id.qp_type))
                        ucma_copy_ud_event(evt, &resp->param.ud);
                else
                        ucma_copy_conn_event(evt, &resp->param.conn);


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to