in efawin/verbs.c [916:951]
static int efa_rq_initialize(struct efa_qp *qp, struct efa_create_qp_resp *resp)
{
struct efa_wq_init_attr wq_attr;
struct efa_rq *rq = &qp->rq;
int err;
if (!rq->wq.wqe_cnt)
return 0;
wq_attr = (struct efa_wq_init_attr) {
.db_mmap_key = resp->rq_db_mmap_key,
.db_off = resp->rq_db_offset,
.cmd_fd = qp->verbs_qp.qp.context->cmd_fd,
.pgsz = qp->page_size,
.sub_cq_idx = resp->recv_sub_cq_idx,
};
err = efa_wq_initialize(&qp->rq.wq, &wq_attr);
if (err)
return err;
rq->buf_size = resp->rq_mmap_size;
#ifndef _WIN32
rq->buf = mmap(NULL, rq->buf_size, PROT_WRITE, MAP_SHARED,
qp->verbs_qp.qp.context->cmd_fd, resp->rq_mmap_key);
if (rq->buf == MAP_FAILED) {
err = errno;
goto err_terminate_wq;
}
#endif
return 0;
err_terminate_wq:
efa_wq_terminate(&rq->wq, qp->page_size);
return err;
}