in efawin/verbs.c [779:818]
static int efa_wq_initialize(struct efa_wq *wq, struct efa_wq_init_attr *attr)
{
uint8_t *db_base;
int err;
int i;
wq->wrid = malloc(wq->wqe_cnt * sizeof(*wq->wrid));
if (!wq->wrid)
return ENOMEM;
wq->wrid_idx_pool = malloc(wq->wqe_cnt * sizeof(uint32_t));
if (!wq->wrid_idx_pool) {
err = ENOMEM;
goto err_free_wrid;
}
#ifndef _WIN32
db_base = mmap(NULL, attr->pgsz, PROT_WRITE, MAP_SHARED, attr->cmd_fd,
attr->db_mmap_key);
if (db_base == MAP_FAILED) {
err = errno;
goto err_free_wrid_idx_pool;
}
wq->db = (uint32_t *)(db_base + attr->db_off);
#endif
/* Initialize the wrid free indexes pool. */
for (i = 0; i < wq->wqe_cnt; i++)
wq->wrid_idx_pool[i] = i;
pthread_spin_init(&wq->wqlock, PTHREAD_PROCESS_PRIVATE);
wq->sub_cq_idx = attr->sub_cq_idx;
return 0;
err_free_wrid_idx_pool:
free(wq->wrid_idx_pool);
err_free_wrid:
free(wq->wrid);
return err;
}