RDMA: стратегия опроса ⇐ C++
RDMA: стратегия опроса
Я попытался обернуть 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.
Я попытался обернуть 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.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как написать код модульного теста для опроса с помощью Coroutine Job?
Anonymous » » в форуме Android - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-