static int destroy_qp(PVRDMADev *dev, union pvrdma_cmd_req *req, union pvrdma_cmd_resp *rsp) { struct pvrdma_cmd_destroy_qp *cmd = &req->destroy_qp; RdmaRmQP *qp; PvrdmaRing *ring; qp = rdma_rm_get_qp(&dev->rdma_dev_res, cmd->qp_handle); if (!qp) { pr_dbg("Invalid QP handle\n"); return -EINVAL; } rdma_rm_dealloc_qp(&dev->rdma_dev_res, cmd->qp_handle); ring = (PvrdmaRing *)qp->opaque; pr_dbg("sring=%p\n", &ring[0]); pvrdma_ring_free(&ring[0]); pr_dbg("rring=%p\n", &ring[1]); pvrdma_ring_free(&ring[1]); rdma_pci_dma_unmap(PCI_DEVICE(dev), ring->ring_state, TARGET_PAGE_SIZE); g_free(ring); return 0; }
int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, uint32_t qp_handle, uint32_t attr_mask, union ibv_gid *dgid, uint32_t dqpn, enum ibv_qp_state qp_state, uint32_t qkey, uint32_t rq_psn, uint32_t sq_psn) { RdmaRmQP *qp; int ret; pr_dbg("qpn=%d\n", qp_handle); qp = rdma_rm_get_qp(dev_res, qp_handle); if (!qp) { return -EINVAL; } pr_dbg("qp_type=%d\n", qp->qp_type); pr_dbg("attr_mask=0x%x\n", attr_mask); if (qp->qp_type == IBV_QPT_SMI) { pr_dbg("QP0 unsupported\n"); return -EPERM; } else if (qp->qp_type == IBV_QPT_GSI) { pr_dbg("QP1\n"); return 0; } if (attr_mask & IBV_QP_STATE) { qp->qp_state = qp_state; pr_dbg("qp_state=%d\n", qp->qp_state); if (qp->qp_state == IBV_QPS_INIT) { ret = rdma_backend_qp_state_init(backend_dev, &qp->backend_qp, qp->qp_type, qkey); if (ret) { return -EIO; } } if (qp->qp_state == IBV_QPS_RTR) { ret = rdma_backend_qp_state_rtr(backend_dev, &qp->backend_qp, qp->qp_type, dgid, dqpn, rq_psn, qkey, attr_mask & IBV_QP_QKEY); if (ret) { return -EIO; } } if (qp->qp_state == IBV_QPS_RTS) { ret = rdma_backend_qp_state_rts(&qp->backend_qp, qp->qp_type, sq_psn, qkey, attr_mask & IBV_QP_QKEY); if (ret) { return -EIO; } } } return 0; }
int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, uint32_t qp_handle, struct ibv_qp_attr *attr, int attr_mask, struct ibv_qp_init_attr *init_attr) { RdmaRmQP *qp; pr_dbg("qpn=%d\n", qp_handle); qp = rdma_rm_get_qp(dev_res, qp_handle); if (!qp) { return -EINVAL; } pr_dbg("qp_type=%d\n", qp->qp_type); return rdma_backend_query_qp(&qp->backend_qp, attr, attr_mask, init_attr); }