调用rdma_disconnect()时,是否在rdma_disconnect()返回之前获取所有已发布的recv工作请求的完成队列事件,或者我应该在rdma_disconnect()返回后进入它们?
答案 0 :(得分:2)
在rdma_disconnect()返回后,接收将以异步(可能)完成(具有“刷新错误”状态)。正如您从rdma_disconnect()的源代码中看到的那样,它所做的就是将QP转换为错误状态并向另一方发送断开连接请求。
将QP转换为错误状态确保发布到QP的所有待处理工作请求都将以错误状态完成,但修改QP操作立即返回,而不等待队列耗尽。类似地,rdma_disconnect()不会等待所有待处理的工作请求完成 - 实际上很难看出它是如何做的,因为RDMA CM实际上没有任何方法可以知道有多少工作请求被排队,让单独查看相关的CQ,看看它们何时完成。
IB规范第1卷第10章详细介绍了工作请求处理,如果您想知道有关转换到错误状态时正在进行的请求的极端情况等等。