static void mlx5_free_context(struct verbs_device *device, struct ibv_context *ibctx) { struct mlx5_context *context = to_mctx(ibctx); int page_size = to_mdev(ibctx->device)->page_size; int i; struct mlx5_wc_uar *wc_uar; if (context->hca_core_clock) munmap(context->hca_core_clock - context->core_clock.offset, to_mdev(&device->device)->page_size); if (context->cc.buf) munmap(context->cc.buf, 4096 * context->num_ports); free(context->bfs); for (i = 0; i < MLX5_MAX_UAR_PAGES; ++i) { if (context->uar[i].regs) munmap(context->uar[i].regs, page_size); } if (context->max_ctx_res_domain) { mlx5_spin_lock(&context->send_db_lock); while (!list_empty(&context->wc_uar_list)) { wc_uar = list_entry(context->wc_uar_list.next, struct mlx5_wc_uar, list); list_del(&wc_uar->list); free(wc_uar); } mlx5_spin_unlock(&context->send_db_lock); }
void mlx5_free_srq_wqe(struct mlx5_srq *srq, int ind) { struct mlx5_wqe_srq_next_seg *next; mlx5_spin_lock(&srq->lock); next = get_wqe(srq, srq->tail); next->next_wqe_index = htobe16(ind); srq->tail = ind; mlx5_spin_unlock(&srq->lock); }
int mlx5_post_srq_recv(struct ibv_srq *ibsrq, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr) { struct mlx5_srq *srq = to_msrq(ibsrq); struct mlx5_wqe_srq_next_seg *next; struct mlx5_wqe_data_seg *scat; int err = 0; int nreq; int i; mlx5_spin_lock(&srq->lock); for (nreq = 0; wr; ++nreq, wr = wr->next) { if (wr->num_sge > srq->max_gs) { err = EINVAL; *bad_wr = wr; break; } if (srq->head == srq->tail) { /* SRQ is full*/ err = ENOMEM; *bad_wr = wr; break; } srq->wrid[srq->head] = wr->wr_id; next = get_wqe(srq, srq->head); srq->head = be16toh(next->next_wqe_index); scat = (struct mlx5_wqe_data_seg *) (next + 1); for (i = 0; i < wr->num_sge; ++i) { scat[i].byte_count = htobe32(wr->sg_list[i].length); scat[i].lkey = htobe32(wr->sg_list[i].lkey); scat[i].addr = htobe64(wr->sg_list[i].addr); } if (i < srq->max_gs) { scat[i].byte_count = 0; scat[i].lkey = htobe32(MLX5_INVALID_LKEY); scat[i].addr = 0; } } if (nreq) { srq->counter += nreq; /* * Make sure that descriptors are written before * we write doorbell record. */ udma_to_device_barrier(); *srq->db = htobe32(srq->counter); } mlx5_spin_unlock(&srq->lock); return err; }