2013-03-15 110 views
0

函數ibv_get_cq_event()塊並且在銷燬所有資源後永遠不會返回。功能ibv_get_cq_event()在破壞後不返回

我會初始化所有InfiniBand資源,在單獨的線程中啓動ibv_get_cq_event,然後銷燬所有InfiniBand資源,但ibv_get_cq_event永不返回。

什麼是正確的初始化和破壞IB(RDMA)?

回答

1

阻止在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資源時停止事件循環。