функция ibv_get_cq_event() не возвращается после уничтожения

Функция ibv_get_cq_event() блокируется и никогда не возвращается даже после уничтожения всех ресурсов.

Я инициализирую все ресурсы InfiniBand, запускаю ibv_get_cq_event в отдельном потоке, затем уничтожаю все ресурсы InfiniBand, но ibv_get_cq_event никогда не возвращается.

Что такое правильная инициализация и уничтожение IB (RDMA)?


person Daniil    schedule 15.03.2013    source источник


Ответы (1)


Блокировка в ibv_get_cq_event() и последующая попытка уничтожить ваши ресурсы примерно эквивалентны созданию сокета, блокировке в read() и последующему вызову close() в сокете в другом потоке. На самом деле канал завершения — это всего лишь файловый дескриптор, а ibv_get_cq_event() — просто оболочка вокруг read(). В обоих случаях read() содержит ссылку на файл, и ядро ​​не разбудит read() только потому, что кто-то другой вызвал close().

Есть как минимум два разумных способа справиться с вашей ситуацией:

  • Прежде чем пытаться очистить ресурсы ИБ, отправьте сигнал потоку, заблокированному в read(), чтобы он разбудил его.

  • используйте fcntl, чтобы установить O_NONBLOCK на comp_channel->fd, а затем используйте цикл событий с poll() или epoll, чтобы узнать, когда канал завершения доступен для чтения. Вызывайте read() только тогда, когда происходит событие, и останавливайте цикл обработки событий при разрыве ресурсов RDMA.

person Roland    schedule 16.03.2013