cq->comp_handler = ib_uverbs_comp_handler;
cq->event_handler = ib_uverbs_cq_event_handler;
cq->cq_context = ev_file ? &ev_file->ev_queue : NULL;
+ /*
+ * If UMEM is not provided here, legacy drivers will set it during
+ * CQ creation based on their internal udata.
+ */
+ cq->umem = umem;
atomic_set(&cq->usecnt, 0);
rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
return ret;
err_free:
- ib_umem_release(umem);
+ ib_umem_release(cq->umem);
rdma_restrack_put(&cq->res);
kfree(cq);
err_event_file:
cq->cq_idx, cq->cpu_addr, cq->size, &cq->dma_addr);
efa_destroy_cq_idx(dev, cq->cq_idx);
- efa_cq_user_mmap_entries_remove(cq);
+ if (cq->cpu_addr)
+ efa_cq_user_mmap_entries_remove(cq);
if (cq->eq) {
xa_erase(&dev->cqs_xa, cq->cq_idx);
synchronize_irq(cq->eq->irq.irqn);
}
- if (cq->umem)
- ib_umem_release(cq->umem);
- else
+ if (cq->cpu_addr)
efa_free_mapped(dev, cq->cpu_addr, cq->dma_addr, cq->size, DMA_FROM_DEVICE);
return 0;
}
cq->ucontext = ucontext;
cq->size = PAGE_ALIGN(cmd.cq_entry_size * entries * cmd.num_sub_cqs);
- if (umem) {
- if (umem->length < cq->size) {
+ if (ibcq->umem) {
+ if (ibcq->umem->length < cq->size) {
ibdev_dbg(&dev->ibdev, "External memory too small\n");
err = -EINVAL;
goto err_out;
}
- if (!ib_umem_is_contiguous(umem)) {
+ if (!ib_umem_is_contiguous(ibcq->umem)) {
ibdev_dbg(&dev->ibdev, "Non contiguous CQ unsupported\n");
err = -EINVAL;
goto err_out;
}
- cq->cpu_addr = NULL;
- cq->dma_addr = ib_umem_start_dma_addr(umem);
- cq->umem = umem;
+ cq->dma_addr = ib_umem_start_dma_addr(ibcq->umem);
} else {
cq->cpu_addr = efa_zalloc_mapped(dev, &cq->dma_addr, cq->size,
DMA_FROM_DEVICE);
cq->ibcq.cqe = result.actual_depth;
WARN_ON_ONCE(entries != result.actual_depth);
- if (!umem)
+ if (cq->cpu_addr)
err = cq_mmap_entries_setup(dev, cq, &resp, result.db_valid);
if (err) {
if (cq->eq)
xa_erase(&dev->cqs_xa, cq->cq_idx);
err_remove_mmap:
- efa_cq_user_mmap_entries_remove(cq);
+ if (cq->cpu_addr)
+ efa_cq_user_mmap_entries_remove(cq);
err_destroy_cq:
efa_destroy_cq_idx(dev, cq->cq_idx);
err_free_mapped:
- if (!umem)
+ if (cq->cpu_addr)
efa_free_mapped(dev, cq->cpu_addr, cq->dma_addr, cq->size,
DMA_FROM_DEVICE);
err_out: