RDMA: стратегия опросаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 RDMA: стратегия опроса

Сообщение Anonymous »


Я попытался обернуть RDMA во вспомогательный класс. У меня были некоторые проблемы с событиями send, которые не генерировали CQE на удаленном компьютере, и я исправил их, заменив этот фрагмент кода:

ibv_wc RdmaBase::wait_event(bool ignore_errors) { ibv_wc ret {}; пустота* ctxt; HENSURE_ERRNO(ibv_get_cq_event(m_comp_channel, &m_cq, &ctxt) == 0); ibv_ack_cq_events (m_cq, 1); HENSURE_ERRNO(ibv_req_notify_cq(m_cq, 0) == 0); пока (правда) { const int num_completions = ibv_poll_cq(m_cq, 1, &ret); HENSURE_ERRNO(num_completions >= 0); если (num_completions == 0) { продолжать; } еще { if(!ignore_errors && ret.status != IBV_WC_SUCCESS) { FATAL_ERROR("Неудачный статус %s (%d) для wr_id %d\n", ibv_wc_status_str(ret.status), ret.статус, (int) ret.wr_id); } перерыв; } } вернуть возврат; } Этим:

ibv_wc RdmaBase::wait_event(bool ignore_errors) { // Это что-то вроде сопрограммы вместо опроса событий в другом потоке ibv_wc ret {}; начинать: если(!m_polling) { пустота* ctxt; HENSURE_ERRNO(ibv_get_cq_event(m_comp_channel, &m_cq, &ctxt) == 0); ibv_ack_cq_events (m_cq, 1); HENSURE_ERRNO(ibv_req_notify_cq(m_cq, 0) == 0); м_поллинг = правда; } пока (правда) { const int num_completions = ibv_poll_cq(m_cq, 1, &ret); HENSURE_ERRNO(num_completions >= 0); если (num_completions == 0) { м_поллинг = ложь; перейти к началу; } еще { if(!ignore_errors && ret.status != IBV_WC_SUCCESS) { FATAL_ERROR("Неудачный статус %s (%d) для wr_id %d\n", ibv_wc_status_str(ret.status), ret.статус, (int) ret.wr_id); } перерыв; } } вернуть возврат; } wait_event() должен получить следующий WC по CQ. Если CQ не пуст, он должен вытолкнуть один WC. Если CQ пуст, функция должна блокироваться до тех пор, пока не будет сгенерирован WC.

Есть ли функциональная разница между этими двумя кодами? Я использую SoftRoCE в Ubuntu 22.04.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»