Опубликованные буферы recv возвращаются синхронно или асинхронно после вызова rdma_disconnect()
При вызове rdma_disconnect() я получаю события очереди завершения для всех опубликованных рабочих запросов recv до того, как rdma_disconnect() вернется, или я должен ожидать, что они придут после того, как rdma_disconnect() вернется?
1 ответ
Прием завершится (со статусом "ошибка сброса") асинхронно (возможно) после возврата rdma_disconnect(). Как видно из источника для rdma_disconnect(), все, что он делает, это переводит QP в состояние ошибки и отправляет запрос на отключение на другую сторону.
Переход QP в состояние ошибки действительно гарантирует, что все ожидающие рабочие запросы, отправленные в QP, будут выполнены с состоянием ошибки, но операция модификации QP немедленно возвращается, не дожидаясь истечения очередей. Точно так же rdma_disconnect() не ожидает завершения всех ожидающих рабочих запросов - на самом деле было бы трудно понять, как это возможно, поскольку CM RDMA на самом деле не имеет никакого способа узнать, сколько рабочих запросов помещено в очередь, в одиночку заглянуть в связанный CQ, чтобы увидеть, когда они все завершены.
Глава 10 тома 1 спецификации IB подробно описывает обработку рабочих запросов, если вас интересуют угловые случаи запросов, выполняющихся в момент перехода к состоянию ошибки, и т. Д.