RDMA WRITE: ibv_wc.byte_len не соответствует тому, что я пытаюсь написать
Я новичок в Infiniband/RDMA, играю с RDMA на оборудовании Mellanox Infiniband. Я использовал исходный код здесь. На первый взгляд, программа работает довольно нормально: сервер записывает несколько байтов в память клиента, используя операцию RDMA_WRITE. Однако позже я обнаружил, что количество переданных байтов, которое указано структурой завершения записи (ibv_wc), не соответствует количеству данных, которые я поместил в структуру ibv_send_wr. Вот код для инициализации ibv_send_wr в rdma_write():
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. Я сделал что-то неправильно?
1 ответ
Согласно странице ibv_poll_cq() в блоге RDMAMojo, byte_len
Поле допустимо только для небольшого подмножества операций, поэтому оно остается неинициализированным в случае операции записи RDMA в очереди отправки.
byte_len: количество переданных байтов. Относится, если очередь приема для входящей отправки или записи RDMA с немедленными операциями. Это значение не включает длину непосредственных данных, если таковые существуют. Относится к очереди отправки для операций чтения RDMA и атомарных операций.