ibv_post_recv()返回-1而不是errno

时间:2013-05-14 08:44:50

标签: c linux infiniband

函数ibv_post_recv()返回-1,但根据文档,它应返回errno。

如何知道这种情况下的失败原因?

最诚挚的问候,

2 个答案:

答案 0 :(得分:0)

返回-1 设置errno。 函数返回时检查errno值。

答案 1 :(得分:0)

您使用的是哪种低级硬件驱动程序?什么版本?我猜它是libmlx4(Mellanox ConnectX / ConnectX-2 / ConnectX-3)。

如果是这样,版本> = libmlx4 1.0.2实际上已修复此问题 - ibv_post_send()将返回错误代码而不是-1。

在任何情况下(这实际上并不是非常依赖于低级驱动程序 - 我认为libmthca,libcxgb4等都差不多),ibv_post_send()可能会立即返回错误的原因是:

  • 发送队列已满(即未收集完成的发送数量> =发送队列的大小)。

  • 发送WR中的操作码无效

  • 收集条目数无效(创建发送队列时指定的< = 0或> max gs条目)

  • 内联数据大于发送队列的最大内联数据

编辑:我看到我过快地阅读了这个问题并且混淆了ibv_post_recv()ibv_post_send()ibv_post_recv()的答案几乎相同,只是更简单一点。基本上ibv_post_recv()可能返回错误的唯一原因是:

  • 接收队列已满

  • 接收工作请求中的分散条目数无效