static struct mlx5_db_page *__add_page(struct mlx5_context *context) { struct mlx5_db_page *page; int ps = to_mdev(context->ibv_ctx.device)->page_size; int pp; int i; int nlong; pp = ps / context->cache_line_size; nlong = (pp + 8 * sizeof(long) - 1) / (8 * sizeof(long)); page = malloc(sizeof *page + nlong * sizeof(long)); if (!page) return NULL; if (mlx5_alloc_buf(&page->buf, ps, ps)) { free(page); return NULL; } page->num_db = pp; page->use_cnt = 0; for (i = 0; i < nlong; ++i) page->free[i] = ~0; page->prev = NULL; page->next = context->db_list; context->db_list = page; if (page->next) page->next->prev = page; return page; }
int mlx5_alloc_srq_buf(struct ibv_context *context, struct mlx5_srq *srq) { struct mlx5_wqe_srq_next_seg *next; int size; int buf_size; int i; struct mlx5_context *ctx; ctx = to_mctx(context); if (srq->max_gs < 0) { errno = EINVAL; return -1; } srq->wrid = malloc(srq->max * sizeof *srq->wrid); if (!srq->wrid) return -1; size = sizeof(struct mlx5_wqe_srq_next_seg) + srq->max_gs * sizeof(struct mlx5_wqe_data_seg); size = max(32, size); size = mlx5_round_up_power_of_two(size); if (size > ctx->max_recv_wr) { errno = EINVAL; return -1; } srq->max_gs = (size - sizeof(struct mlx5_wqe_srq_next_seg)) / sizeof(struct mlx5_wqe_data_seg); srq->wqe_shift = mlx5_ilog2(size); buf_size = srq->max * size; if (mlx5_alloc_buf(&srq->buf, buf_size, to_mdev(context->device)->page_size)) { free(srq->wrid); return -1; } memset(srq->buf.buf, 0, buf_size); /* * Now initialize the SRQ buffer so that all of the WQEs are * linked into the list of free WQEs. */ for (i = 0; i < srq->max; ++i) { next = get_wqe(srq, i); next->next_wqe_index = htobe16((i + 1) & (srq->max - 1)); } srq->head = 0; srq->tail = srq->max - 1; return 0; }