[ofw] Need code examples
Sean Hefty
sean.hefty at intel.com
Wed Nov 25 09:43:59 PST 2009
>I'm using RC QP connection but data in the buffer on receive side changes
>without any actions (ibv_post_recv) on receive side. I'm tried to use multiple
>buffers to send/recv data frames but on receive side only ONE buffer (first
>registered with ibv_reg_mr) works. I don't found any examples where used a pool
>of buffers for receive side (for sender it is). Would you help me in such
>things?
Just allocate an array of buffers, register the entire array, then post each
buffer separately:
// define these as whatever makes sense for your app
#define MAX_RECV_QUEUE_SIZE 100
struct recv_msg {
char buffer[256];
};
...
// allocate an array of buffers
recvs = (struct recv_msg *)
malloc(sizeof(struct recv_msg) * MAX_RECV_QUEUE_SIZE);
// register the array
recv_mr = ibv_reg_mr(pd, recvs,
sizeof(struct recv_msg) * MAX_RECV_QUEUE_SIZE,
IBV_ACCESS_LOCAL_WRITE);
...
// post a bunch of receives - one at a time
struct ibv_recv_wr recv_wr, *recv_failure;
struct ibv_sge sge;
int i, ret = 0;
recv_wr.next = NULL;
recv_wr.sg_list = &sge;
recv_wr.num_sge = 1;
recv_wr.wr_id = (uintptr_t) node;
sge.length = sizeof(struct recv_msg);
sge.lkey = recv_mr->lkey;
for (i = 0; i < MAX_RECV_QUEUE_SIZE && !ret; i++) {
sge.addr = (uintptr_t) &recvs[i];
ret = ibv_post_recv(qp, &recv_wr, &recv_failure);
if (ret) {
printf("failed to post receives: 0x%x\n", ret);
break;
}
}
- Sean
More information about the ofw
mailing list