功能ibv_get_cq_event()在破坏后不返回

问题描述:

函数ibv_get_cq_event()块并且在销毁所有资源后永远不会返回。功能ibv_get_cq_event()在破坏后不返回

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

什么是正确的初始化和破坏IB(RDMA)?

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

有至少两个合理的方式来处理您的情况:

  • 之前试图清理IB资源,发送信号给挡在read()线程将其唤醒。已知

  • 使用fcntl上设置comp_channel->fdO_NONBLOCK,然后使用一个事件循环与poll()epoll当完成通道是可读的。当有事件发生时,请仅调用read(),并在拆除RDMA资源时停止事件循环。