2015-10-01 9 views
0

Я новичок Infiniband/RDMA, играющий с RDMA на оборудовании Mellanox Infiniband. Я использовал исходный код here. На первый взгляд программа работает нормально: сервер записывает несколько байтов в клиентскую память, используя операцию RDMA_WRITE. Однако позже я обнаружил, что количество переданных байтов, которое указано структурой завершения записи (ibv_wc), не соответствует количеству данных, которые я ввел в структуру ibv_send_wr. Вот код для инициализации ibv_send_wr в rdma_write():RDMA WRITE: ibv_wc.byte_len не соответствует тому, что я пытаюсь написать

ctx->sge_list.addr = (uintptr_t)ctx->buf; 
ctx->sge_list.length = ctx->size; //which is 65536 
ctx->sge_list.lkey = ctx->mr->lkey; 
ctx->wr.wr.rdma.remote_addr = data->remote_connection->vaddr; 
ctx->wr.wr_id = RDMA_WRID; 
ctx->wr.sg_list = &ctx->sge_list; 
ctx->wr_num_sge = 1; 
ctx->wr.opcode = IBV_WR_RDMA_WRITE; 
ctx->wr.send_flags = IBV_SEND_SIGNALED; 
ctx->wr.next = NULL; 

Затем я прочитал ibv_wc.byte_len после я получаю запись в завершении записи в очереди завершения записи. Он показывает случайные числа: 32537, 32743, 32533. Я предполагаю, что передача успешна, потому что ibv_wc.status равен IBV_WC_SUCCESS. Я сделал что-то не так?

ответ

0

Согласно ibv_poll_cq() странице в RDMAMojo блоге, то byte_len поле действует только для небольшого подмножества операций, так что остается неинициализированным в вашем случае операции RDMA записи на очереди отправки.

byte_len: Число переданных байт. Релевантно, если очередь приема для входящих или RDMA записей с немедленными операциями. Это значение не включает длину данных, если таковая существует. Релевантно в очереди отправки для операций чтения и атома RDMA.

+0

Спасибо Аггей! Теперь я просто проверяю правильность возвращаемого значения или нет. Он отлично работает для меня. –