/* ib_create_srq ib_destroy_srq */ int srq_1( IN struct config_t *config, IN struct resources *res, IN struct ib_client *test_client) { struct ib_pd *pd = ERR_PTR(-EINVAL); struct ib_srq *srq = ERR_PTR(-EINVAL); int result = -1; int rc; TEST_CASE("ib_create_srq ib_destroy_srq"); pd = ib_alloc_pd(res->device); CHECK_PTR("ib_alloc_pd", !IS_ERR(pd), goto cleanup); res->attributes.srq_init_attr.event_handler = srq_event_handler; init_srq_cap(config, res, &res->attributes.srq_init_attr); srq = ib_create_srq(pd, &res->attributes.srq_init_attr); CHECK_PTR("ib_create_srq", !IS_ERR(srq), goto cleanup); rc = ib_destroy_srq(srq); CHECK_VALUE("ib_destroy_srq", rc, 0, goto cleanup); PASSED; result = 0; cleanup: if (!IS_ERR(pd)) { rc = ib_dealloc_pd(pd); CHECK_VALUE("ib_dealloc_pd", rc, 0, return -1); }
static int roq_eth_init_qp(struct net_device *ndev) { struct roq_eth_priv *vdev = netdev_priv(ndev); struct ib_qp_init_attr create_qp_attrs; struct ib_device *ibdev = vdev->ibdev; struct ib_qp_attr qp_attr; enum ib_qp_attr_mask qp_attr_mask; struct ib_srq_init_attr srq_attr; int rank, i, size, ret = 0; /* initialize variables */ memset(&create_qp_attrs, 0, sizeof(struct ib_qp_init_attr)); rank = roq_tcoords_to_rank(vdev->netdesc, vdev->personality.Network_Config.Acoord, vdev->personality.Network_Config.Bcoord, vdev->personality.Network_Config.Ccoord, vdev->personality.Network_Config.Dcoord, vdev->personality.Network_Config.Ecoord); if (IS_ERR_VALUE(rank)) { ret = -EINVAL; pr_info("roq_eth_init_qp: invalid rank\n"); goto out; } if ((ret = roq_alloc_rx_buffers(vdev)) != 0) goto out; /* create completion queues */ vdev->send_cq = ib_create_cq(ibdev, roq_eth_tx_ib_compl, NULL, vdev->ndev, MAX_TX_SKBS, 0); if (IS_ERR(vdev->send_cq)) { pr_warn("roq_eth_init_qp: ib_create_cq failed"); ret = PTR_ERR(vdev->send_cq); vdev->send_cq = NULL; goto out; } vdev->recv_cq = ib_create_cq(ibdev, roq_eth_rx_ib_compl, NULL, vdev->ndev, MAX_RX_SKBS, 0); if (IS_ERR(vdev->recv_cq)) { pr_warn("roq_eth_init_qp: ib_create_cq failed"); ret = PTR_ERR(vdev->recv_cq); vdev->recv_cq = NULL; goto out; } create_qp_attrs.send_cq = vdev->send_cq; create_qp_attrs.recv_cq = vdev->recv_cq; /* allocate protection domain and qp array */ vdev->kpd = ib_alloc_pd(ibdev); if (IS_ERR(vdev->kpd)) { pr_warn("roq_eth_init_qp: ib_alloc_pd failed"); ret = PTR_ERR(vdev->kpd); vdev->kpd = NULL; goto out; } memset(&srq_attr, 0, sizeof(struct ib_srq_init_attr)); srq_attr.attr.max_wr = MAX_RX_SKBS; srq_attr.attr.max_sge = 1; vdev->srq = ib_create_srq(vdev->kpd, &srq_attr); if (IS_ERR(vdev->srq)) { pr_warn("roq_eth_init_qp: ib_create_srq failed"); ret = PTR_ERR(vdev->srq); vdev->srq = NULL; goto out; } /* set some more parameters */ create_qp_attrs.qp_type = IB_QPT_UD; create_qp_attrs.event_handler = NULL; create_qp_attrs.qp_context = NULL; create_qp_attrs.srq = vdev->srq; create_qp_attrs.cap.max_send_wr = MAX_TX_SKBS; create_qp_attrs.cap.max_recv_wr = 1; create_qp_attrs.cap.max_send_sge = 1; create_qp_attrs.cap.max_recv_sge = 1; create_qp_attrs.cap.max_inline_data = 0; size = sizeof(struct ib_qp *) * vdev->part_size; vdev->qps = kmalloc(size, GFP_KERNEL); if (!vdev->qps) { pr_warn("roq_eth_init_qp: kmalloc failed\n"); goto out; } for (i = 0; i < vdev->part_size; i++) { vdev->qps[i] = ib_create_qp(vdev->kpd, &create_qp_attrs); if (IS_ERR(vdev->qps[i])) { ret = PTR_ERR(vdev->qps[i]); pr_warn("roq_eth_init_qp: ib_create_qp failed: %d", ret); goto out; } } ret = ib_req_notify_cq(vdev->send_cq, IB_CQ_NEXT_COMP); if (ret) goto out; ret = ib_req_notify_cq(vdev->recv_cq, IB_CQ_NEXT_COMP); if (ret) goto out; for (i = 0; i < vdev->part_size; i++) { qp_attr_mask = 0; qp_attr_mask |= IB_QP_STATE; qp_attr.qp_state = IB_QPS_RTS; qp_attr_mask |= IB_QP_AV; /* this QP will send to peer rank i (zero based) */ qp_attr.ah_attr.dlid = i; qp_attr_mask |= IB_QP_DEST_QPN; /* * this QP will send to peer QP num rank + 1 * (QP zero is reserved) */ qp_attr.dest_qp_num = rank + 1; ib_modify_qp(vdev->qps[i], &qp_attr, qp_attr_mask); } /* SETUP RECEIVE QP */ for (i = 0; i < MAX_RX_SKBS; i++) roq_eth_post_recv(vdev, i); if (vdev->fix_rem == 1) { roq_eth_rem_init_qp(ndev); vdev->fix_rem = 0; } out: if (ret) { pr_warn("roq_eth_init_qp: rv = %d\n", ret); roq_eth_cleanup_ofa(vdev); } return ret; }