函数 ibv_post_recv() 返回 -1,但根据文档,它应该返回 errno。
在这种情况下如何知道失败的原因?
此致,
您使用的是什么低级硬件驱动程序?什么版本?我猜它是 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()
基本上可能返回错误的唯一原因是:
接收队列已满
接收工作请求中的分散条目数无效
它返回 -1并设置 errno。函数返回时检查 errno 值。