rdma_create_qp()错误:无效参数

问题描述:

我是rdma编程新手,目前正在使用ib动词和rdma cma设置一个简单的客户端/服务器,但已经遇到困难。我的服务器运行并等待连接,但我的客户端从不连接,因为它在rdma_create_qp()失败。我不知道,可能需要什么样的信息来帮助解决这个问题,但我会的要求所需要的信息进行编辑。(目前snipets的相关信息,因为他们出现在我的代码)rdma_create_qp()错误:无效参数

qp_init_attr.send_cq = cq; 
qp_init_attr.recv_cq = cq; 
qp_init_attr.qp_type = IBV_QPT_RC; 
qp_init_attr.cap.max_send_wr = 16; 
qp_init_attr.cap.max_recv_wr = 16; 
qp_init_attr.cap.max_send_sge = 8; 
qp_init_attr.cap.max_recv_sge = 8; 
if(rdma_create_qp(cm_id, pd, &qp_init_attr)){ 
    fprintf(stderr, "Error, rdma_create_qp() failed: %s\n", strerror(errno)); 
    return -1; 
} 
+0

您应该检查errno的值。这可能会给你一些关于发生了什么的提示。 – JC1

从混帐(https://github.com/linux-rdma/rdma-core/blob/master/librdmacm/cma.c)librdmacm的页面:

你会在下列情况下得到EINVAL:

  1. ID-> QP不为NULL(已分配)。
  2. id的上下文与可选的pd的上下文不同。
  3. send_cq或receive_cq被分配给id,并且与qp_init_attr中指定的不同。

请勿使用cm_id进行调用。假设您在事件RDMA_CM_EVENT_ROUTE_RESOLVED上调用rdma_create_qp,则应使用evt->id,它是您创建的客户端连接的rdma_id。