rdma_create_qp modifies the qp_init_attr structure passed in by the user to return the actual QP capabilities that were allocated. If the qp_init_attr does not specify CQs, the librdmacm will allocate CQs for the user and return them.
rdma_get_request will allocate a QP off newly connected rdma_cm_id if the corresponding listen request is associated with a qp_init_attr structure. The librdmacm passes in the listen-> qp_init_attr structure into the rdma_create_qp call. rdma_create_qp ends up modifying the qp_init_attr's associated with the listen. The result is that future calls to rdma_get_request will use the modified qp attributes, rather than those specified by the user. Fix this by having rdma_get_request pass in a copy of the qp_init_attr, rather than modifying those associated with the listen. Also update the man page for rdma_create_qp to indicate that the qp_init_attr structure may be modified on output. Signed-off-by: Sean Hefty <sean.he...@intel.com> --- I added a while(1) loop to rdma_server to allow clients to connected repeatedly, and this worked for me. Jonathan, can you see if this works for your testing as well? If so, I'll commit. man/rdma_create_qp.3 | 3 +++ src/cma.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/man/rdma_create_qp.3 b/man/rdma_create_qp.3 index 9d2de76..7445db3 100644 --- a/man/rdma_create_qp.3 +++ b/man/rdma_create_qp.3 @@ -39,6 +39,9 @@ a send or receive completion queue is not specified, then a CQ will be allocated by the rdma_cm for the QP, along with corresponding completion channels. Completion channels and CQ data created by the rdma_cm are exposed to the user through the rdma_cm_id structure. +.P +The actual capabilities and properties of the created QP will be +returned to the user through the qp_init_attr parameter. .SH "SEE ALSO" rdma_bind_addr(3), rdma_resolve_addr(3), rdma_destroy_qp(3), ibv_create_qp(3), ibv_modify_qp(3) diff --git a/src/cma.c b/src/cma.c index 253cf80..7ac5335 100755 --- a/src/cma.c +++ b/src/cma.c @@ -1368,7 +1368,10 @@ int rdma_get_request(struct rdma_cm_id *listen, struct rdma_cm_id **id) } if (id_priv->qp_init_attr) { - ret = rdma_create_qp(event->id, id_priv->pd, id_priv->qp_init_attr); + struct ibv_qp_init_attr attr; + + attr = *id_priv->qp_init_attr; + ret = rdma_create_qp(event->id, id_priv->pd, &attr); if (ret) goto err; } -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html