static int destroy_cq(PVRDMADev *dev, union pvrdma_cmd_req *req, union pvrdma_cmd_resp *rsp) { struct pvrdma_cmd_destroy_cq *cmd = &req->destroy_cq; RdmaRmCQ *cq; PvrdmaRing *ring; pr_dbg("cq_handle=%d\n", cmd->cq_handle); cq = rdma_rm_get_cq(&dev->rdma_dev_res, cmd->cq_handle); if (!cq) { pr_dbg("Invalid CQ handle\n"); return -EINVAL; } ring = (PvrdmaRing *)cq->opaque; pvrdma_ring_free(ring); /* ring_state was in slot 1, not 0 so need to jump back */ rdma_pci_dma_unmap(PCI_DEVICE(dev), --ring->ring_state, TARGET_PAGE_SIZE); g_free(ring); rdma_rm_dealloc_cq(&dev->rdma_dev_res, cmd->cq_handle); return 0; }
int rdma_rm_alloc_cq(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, uint32_t cqe, uint32_t *cq_handle, void *opaque) { int rc; RdmaRmCQ *cq; cq = res_tbl_alloc(&dev_res->cq_tbl, cq_handle); if (!cq) { return -ENOMEM; } cq->opaque = opaque; cq->notify = false; rc = rdma_backend_create_cq(backend_dev, &cq->backend_cq, cqe); if (rc) { rc = -EIO; goto out_dealloc_cq; } return 0; out_dealloc_cq: rdma_rm_dealloc_cq(dev_res, *cq_handle); return rc; }