0

我是 rdma 编程的新手,目前正在使用 ib 动词和 rdma cma 设置一个简单的客户端/服务器,但已经碰壁了。我的服务器运行并等待连接,但我的客户端从未连接,因为它在 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;
}
4

2 回答 2

1

不要用 cm_id 打电话。假设您调用rdma_create_qpevent RDMA_CM_EVENT_ROUTE_RESOLVED,您应该使用evt->id,这是您创建的客户端连接的 rdma_id。

于 2017-02-23T16:55:40.223 回答
0

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

在以下情况下,您会得到 EINVAL:

  1. id->qp 不是 NULL(已分配)。
  2. id 的上下文不同于可选给定的 pd 之一。
  3. send_cq 或receive_cq 分配给id,并且与qp_init_attr 中指定的不同。
于 2017-02-21T13:07:24.330 回答