函数ibv_get_cq_event()阻止并且在销毁所有资源后永远不会返回。
我初始化所有InfiniBand资源,在单独的线程中启动ibv_get_cq_event,然后销毁所有InfiniBand资源,但ibv_get_cq_event永远不会返回。
正确的初始化和销毁IB(RDMA)是什么?
答案 0 :(得分:1)
阻塞ibv_get_cq_event()
然后尝试销毁资源大致相当于创建一个套接字,在read()
中阻塞,然后在另一个线程中调用套接字上的close()
。事实上,内部完成通道实际上只是一个文件描述符,ibv_get_cq_event()
几乎只是read()
的包装器。在这两种情况下,read()
都拥有对文件的引用,内核不会仅仅因为其他人调用read()
而唤醒close()
。
至少有两种合理的方法来处理你的情况:
在尝试清理IB资源之前,向read()
中被阻止的线程发送信号以将其唤醒。
使用fcntl
在O_NONBLOCK
上设置comp_channel->fd
,然后使用poll()
或epoll
的事件循环来知道完成频道是可读。只有在有事件时才调用read()
,并在拆除RDMA资源时停止事件循环。