3

调用 rdma_disconnect() 时,我是否会在 rdma_disconnect() 返回之前获得所有已发布的 recv 工作请求的完成队列事件,或者我应该期望它们在 rdma_disconnect() 返回之后进入?

4

1 回答 1

2

在 rdma_disconnect() 返回后,接收将异步(可能)完成(带有“刷新错误”状态)。从 rdma_disconnect() 的源代码可以看出,它所做的只是将 QP 转换为错误状态并向另一端发送断开连接请求。

将 QP 转换到错误状态确实可以保证发布到 QP 的所有待处理工作请求都将以错误状态完成,但修改 QP 操作会立即返回,而无需等待队列耗尽。类似地,rdma_disconnect() 不会等待所有待处理的工作请求完成——实际上很难看出它是如何完成的,因为 RDMA CM 并没有办法知道有多少工作请求排队,让单独查看相关的 CQ 以查看它们何时全部完成。

IB 规范第 1 卷的第 10 章非常详细地介绍了工作请求处理,如果您想知道关于在转换到错误状态时正在进行的请求的极端情况等。

于 2011-05-21T05:12:06.740 回答