函数ibv_get_cq_event()在销毁后不会返回

时间:2013-03-15 07:55:57

标签: linux infiniband rdma

函数ibv_get_cq_event()阻止并且在销毁所有资源后永远不会返回。

我初始化所有InfiniBand资源,在单独的线程中启动ibv_get_cq_event,然后销毁所有InfiniBand资源,但ibv_get_cq_event永远不会返回。

正确的初始化和销毁​​IB(RDMA)是什么?

1 个答案:

答案 0 :(得分:1)

阻塞ibv_get_cq_event()然后尝试销毁资源大致相当于创建一个套接字,在read()中阻塞,然后在另一个线程中调用套接字上的close()。事实上,内部完成通道实际上只是一个文件描述符,ibv_get_cq_event()几乎只是read()的包装器。在这两种情况下,read()都拥有对文件的引用,内核不会仅仅因为其他人调用read()而唤醒close()

至少有两种合理的方法来处理你的情况:

  • 在尝试清理IB资源之前,向read()中被阻止的线程发送信号以将其唤醒。

  • 使用fcntlO_NONBLOCK上设置comp_channel->fd,然后使用poll()epoll的事件循环来知道完成频道是可读。只有在有事件时才调用read(),并在拆除RDMA资源时停止事件循环。