0

我正在尝试创建一个 QueuePair ,我必须通过设置 的字段并将其提供给 create 函数ibv_create_qp()来描述队列对的大小。struct ibv_qp_cap我的问题是与max_send_wr可以发布到该特定队列对的发送队列的未完成工作请求的最大数量相对应的字段。

根据各种 Web 资源 [1,2],您应该将此特定字段设置在 [0 ... dev_cap.max_qp_wr] 范围内的某个位置,并设置为max_qp_wr支持的任何发送或接收队列上未完成的工作请求的最大数量RDMA 设备(您可以通过使用 查询您的设备来获取信息ibv_devinfo -v)。在尝试创建 QueuePair 时,当我将字段设置为可能的最大值(max_qp_wr,我的设备为 32K)时,ibv_create_qp()函数失败并出现ENOMEM错误。通过反复试验,我发现如果我将其降低到 8K,它就可以正常工作。

因此,我很想知道是否有一种确定性的方法来计算max_send_wrRDMA 设备的值,而无需进行反复试验?此外,根据一些 [1],对于特定的 RDMA 设备,发送或接收队列可能还有其他考虑因素,以防止使用最大值创建 QP。这些 RDMA 设备特定的考虑因素是什么,它们如何影响最大值的计算?

[1] https://www.rdmamojo.com/2012/12/21/ibv_create_qp/

[2] https://linux-rdma.vger.kernel.narkive.com/rkR0gUjT/rdma-create-qp-and-max-send-wr

4

2 回答 2

1

我不确定是否有确定性和可移植的方式来回答您的问题。在某些设备中,设备对工作队列的大小而不是条目的数量(例如 Mellanox 设备)构成了限制,因此取决于其他参数,例如最大内联大小和分散-聚集条目,实际数量发送工作请求可能。

于 2019-11-17T07:09:49.040 回答
0

尽管这是两年前的一个问题,但我只想指出,当您在 中指定一个数字时max_send_wr,设备驱动程序会尝试分配一个大于该大小的大小(主要是 2 的幂的数字)。我建议您深入研究一下驱动程序代码,以了解这种计算是如何发生的。

在实践中,如果你真的想达到你可以为 QP 设置的最大大小,你可以先测试max_send_wr你可以设置的最大值,然后加上IBV_EXP_QP_CREATE_IGNORE_SQ_OVERFLOWor IBV_EXP_QP_CREATE_IGNORE_RQ_OVERFLOW,这样你仍然可以在max_send_wr限制后发布 WR。

于 2021-08-19T23:01:21.290 回答