static int isert_conn_qp_create(struct isert_connection *isert_conn) { struct rdma_cm_id *cm_id = isert_conn->cm_id; struct isert_device *isert_dev = isert_conn->isert_dev; struct ib_qp_init_attr qp_attr; int err; int cq_idx; int max_wr = ISER_MAX_WCE; TRACE_ENTRY(); cq_idx = isert_get_cq_idx(isert_dev); memset(&qp_attr, 0, sizeof(qp_attr)); qp_attr.event_handler = isert_async_evt_handler; qp_attr.qp_context = isert_conn; qp_attr.send_cq = isert_dev->cq_desc[cq_idx].cq; qp_attr.recv_cq = isert_dev->cq_desc[cq_idx].cq; isert_conn->cq_desc = &isert_dev->cq_desc[cq_idx]; qp_attr.cap.max_send_sge = isert_conn->max_sge; qp_attr.cap.max_recv_sge = 3; qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR; qp_attr.qp_type = IB_QPT_RC; do { if (max_wr < ISER_MIN_SQ_SIZE) { pr_err("Failed to create qp, not enough memory\n"); goto fail_create_qp; } qp_attr.cap.max_send_wr = max_wr; qp_attr.cap.max_recv_wr = max_wr; err = rdma_create_qp(cm_id, isert_dev->pd, &qp_attr); if (err && err != -ENOMEM) { pr_err("Failed to create qp, err:%d\n", err); goto fail_create_qp; } max_wr /= 2; } while (err == -ENOMEM); isert_conn->qp = cm_id->qp; pr_info("iser created cm_id:%p qp:0x%X\n", cm_id, cm_id->qp->qp_num); out: TRACE_EXIT_RES(err); return err; fail_create_qp: mutex_lock(&dev_list_mutex); isert_dev->cq_qps[cq_idx]--; mutex_unlock(&dev_list_mutex); goto out; }
static int isert_conn_qp_create(struct isert_connection *isert_conn) { struct rdma_cm_id *cm_id = isert_conn->cm_id; struct isert_device *isert_dev = isert_conn->isert_dev; struct ib_qp_init_attr qp_attr; int err; int cq_idx; int max_wr = ISER_MAX_WCE; TRACE_ENTRY(); cq_idx = isert_get_cq_idx(isert_dev); memset(&qp_attr, 0, sizeof(qp_attr)); qp_attr.event_handler = isert_async_evt_handler; qp_attr.qp_context = isert_conn; qp_attr.send_cq = isert_dev->cq_desc[cq_idx].cq; qp_attr.recv_cq = isert_dev->cq_desc[cq_idx].cq; isert_conn->cq_desc = &isert_dev->cq_desc[cq_idx]; /* * A quote from the OFED 1.5.3.1 release notes * (docs/release_notes/mthca_release_notes.txt), section "Known Issues": * In mem-free devices, RC QPs can be created with a maximum of * (max_sge - 1) entries only; UD QPs can be created with a maximum of * (max_sge - 3) entries. * A quote from the OFED 1.2.5 release notes * (docs/mthca_release_notes.txt), section "Known Issues": * In mem-free devices, RC QPs can be created with a maximum of * (max_sge - 3) entries only. */ isert_conn->max_sge = isert_dev->device_attr.max_sge - 3; WARN_ON(isert_conn->max_sge < 1); qp_attr.cap.max_send_sge = isert_conn->max_sge; qp_attr.cap.max_recv_sge = 3; qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR; qp_attr.qp_type = IB_QPT_RC; do { if (max_wr < ISER_MIN_SQ_SIZE) { pr_err("Failed to create qp, not enough memory\n"); goto fail_create_qp; } qp_attr.cap.max_send_wr = max_wr; qp_attr.cap.max_recv_wr = max_wr; err = rdma_create_qp(cm_id, isert_dev->pd, &qp_attr); if (err && err != -ENOMEM) { pr_err("Failed to create qp, err:%d\n", err); goto fail_create_qp; } max_wr /= 2; } while (err == -ENOMEM); isert_conn->qp = cm_id->qp; pr_info("iser created cm_id:%p qp:0x%X\n", cm_id, cm_id->qp->qp_num); out: TRACE_EXIT_RES(err); return err; fail_create_qp: mutex_lock(&dev_list_mutex); isert_dev->cq_qps[cq_idx]--; mutex_unlock(&dev_list_mutex); goto out; }