Loading lib/nvmf/conn.c +2 −2 Original line number Diff line number Diff line Loading @@ -399,7 +399,7 @@ nvmf_init_conn_properites(struct spdk_nvmf_conn *conn, conn->cntlid = response->status_code_specific.success.cntlid; session->max_connections_allowed = g_nvmf_tgt.MaxConnectionsPerSession; nvmf_init_session_properties(session, conn->sq_depth); nvmf_init_session_properties(session, conn->rdma.sq_depth); /* Update the session logical controller data with any * application fabric side limits Loading Loading @@ -495,7 +495,7 @@ static int nvmf_check_rdma_completions(struct spdk_nvmf_conn *conn) int cq_count = 0; int i; for (i = 0; i < conn->sq_depth; i++) { for (i = 0; i < conn->rdma.sq_depth; i++) { tx_desc = NULL; rc = ibv_poll_cq(conn->rdma.cq, 1, &wc); Loading lib/nvmf/conn.h +0 −4 Original line number Diff line number Diff line Loading @@ -63,10 +63,6 @@ struct spdk_nvmf_conn { /* * values saved from fabric connect and private data */ uint8_t responder_resources; uint8_t initiator_depth; uint16_t sq_depth; uint16_t cq_depth; uint16_t qid; uint16_t cntlid; Loading lib/nvmf/rdma.c +33 −33 Original line number Diff line number Diff line Loading @@ -128,7 +128,7 @@ nvmf_rdma_queue_init(struct spdk_nvmf_conn *conn, * completions. Three times the target connection SQ depth should be more * than enough. */ conn->rdma.cq = ibv_create_cq(verbs, (conn->sq_depth * 3), conn, conn->rdma.comp_channel, 0); conn->rdma.cq = ibv_create_cq(verbs, (conn->rdma.sq_depth * 3), conn, conn->rdma.comp_channel, 0); if (!conn->rdma.cq) { SPDK_ERRLOG("create cq error!\n"); goto cq_error; Loading @@ -138,8 +138,8 @@ nvmf_rdma_queue_init(struct spdk_nvmf_conn *conn, attr.qp_type = IBV_QPT_RC; attr.send_cq = conn->rdma.cq; attr.recv_cq = conn->rdma.cq; attr.cap.max_send_wr = conn->cq_depth; attr.cap.max_recv_wr = conn->sq_depth; attr.cap.max_send_wr = conn->rdma.cq_depth; attr.cap.max_recv_wr = conn->rdma.sq_depth; attr.cap.max_send_sge = NVMF_DEFAULT_TX_SGE; attr.cap.max_recv_sge = NVMF_DEFAULT_RX_SGE; Loading Loading @@ -303,7 +303,7 @@ nvmf_post_rdma_read(struct spdk_nvmf_conn *conn, * Queue the rdma read if it would exceed max outstanding * RDMA read limit. */ if (conn->rdma.pending_rdma_read_count == conn->initiator_depth) { if (conn->rdma.pending_rdma_read_count == conn->rdma.initiator_depth) { SPDK_TRACELOG(SPDK_TRACE_RDMA, "Insert rdma read into pending queue: tx_desc %p\n", tx_desc); STAILQ_REMOVE(&conn->rdma.qp_tx_active_desc, tx_desc, nvme_qp_tx_desc, link); Loading Loading @@ -430,8 +430,8 @@ nvmf_post_rdma_recv(struct spdk_nvmf_conn *conn, the SQ head counter opening up another RX recv slot. */ conn->sq_head < (conn->sq_depth - 1) ? (conn->sq_head++) : (conn->sq_head = 0); SPDK_TRACELOG(SPDK_TRACE_DEBUG, "sq_head %x, sq_depth %x\n", conn->sq_head, conn->sq_depth); conn->sq_head < (conn->rdma.sq_depth - 1) ? (conn->sq_head++) : (conn->sq_head = 0); SPDK_TRACELOG(SPDK_TRACE_DEBUG, "sq_head %x, sq_depth %x\n", conn->sq_head, conn->rdma.sq_depth); wr.wr_id = (uintptr_t)rx_desc; wr.next = NULL; Loading Loading @@ -531,8 +531,8 @@ nvmf_rdma_connect(struct rdma_cm_event *event) /* check for private data */ if (event->param.conn.private_data_len < sizeof(union spdk_nvmf_rdma_private_data)) { SPDK_TRACELOG(SPDK_TRACE_RDMA, "No private nvmf connection setup data\n"); conn->sq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->cq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->rdma.sq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->rdma.cq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ } else { pdata = event->param.conn.private_data; if (pdata == NULL) { Loading @@ -542,17 +542,17 @@ nvmf_rdma_connect(struct rdma_cm_event *event) } /* Save private details for later validation and use */ conn->sq_depth = pdata->pd_request.hsqsize; conn->cq_depth = pdata->pd_request.hrqsize; conn->rdma.sq_depth = pdata->pd_request.hsqsize; conn->rdma.cq_depth = pdata->pd_request.hrqsize; conn->qid = pdata->pd_request.qid; /* double send queue size for R/W commands */ conn->cq_depth *= 2; conn->rdma.cq_depth *= 2; if (conn->qid > 0) { conn->type = CONN_TYPE_IOQ; } SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: QID %x\n", conn->qid); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: CQ Depth %x\n", conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: SQ Depth %x\n", conn->sq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: CQ Depth %x\n", conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: SQ Depth %x\n", conn->rdma.sq_depth); } /* adjust conn settings to device limits */ Loading @@ -562,15 +562,15 @@ nvmf_rdma_connect(struct rdma_cm_event *event) goto err2; } if (conn->cq_depth > ibdev_attr.max_cqe) { conn->cq_depth = ibdev_attr.max_cqe; if (conn->rdma.cq_depth > ibdev_attr.max_cqe) { conn->rdma.cq_depth = ibdev_attr.max_cqe; } if (conn->sq_depth > ibdev_attr.max_qp_wr) { conn->sq_depth = ibdev_attr.max_qp_wr; if (conn->rdma.sq_depth > ibdev_attr.max_qp_wr) { conn->rdma.sq_depth = ibdev_attr.max_qp_wr; } conn->sq_depth = nvmf_min(conn->sq_depth, conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted CQ Depth %x\n", conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted SQ Depth %x\n", conn->sq_depth); conn->rdma.sq_depth = nvmf_min(conn->rdma.sq_depth, conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted CQ Depth %x\n", conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted SQ Depth %x\n", conn->rdma.sq_depth); if (conn_id->ps == RDMA_PS_TCP) { SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect flow control: %x\n", event->param.conn.flow_control); Loading @@ -584,16 +584,16 @@ nvmf_rdma_connect(struct rdma_cm_event *event) SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect SRQ %x\n", event->param.conn.srq); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect qp_num %x\n", event->param.conn.qp_num); conn->responder_resources = nvmf_min(event->param.conn.responder_resources, conn->rdma.responder_resources = nvmf_min(event->param.conn.responder_resources, ibdev_attr.max_qp_rd_atom); conn->initiator_depth = nvmf_min(event->param.conn.initiator_depth, conn->rdma.initiator_depth = nvmf_min(event->param.conn.initiator_depth, ibdev_attr.max_qp_init_rd_atom); if (event->param.conn.responder_resources != conn->responder_resources || event->param.conn.initiator_depth != conn->initiator_depth) { if (event->param.conn.responder_resources != conn->rdma.responder_resources || event->param.conn.initiator_depth != conn->rdma.initiator_depth) { SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted Responder Resources %x\n", conn->responder_resources); conn->rdma.responder_resources); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted Initiator Depth %x\n", conn->initiator_depth); conn->rdma.initiator_depth); } } Loading Loading @@ -643,14 +643,14 @@ nvmf_rdma_connect(struct rdma_cm_event *event) param = &event->param.conn; if (conn_id->ps == RDMA_PS_TCP) { event->param.conn.responder_resources = conn->responder_resources; event->param.conn.initiator_depth = conn->initiator_depth; event->param.conn.responder_resources = conn->rdma.responder_resources; event->param.conn.initiator_depth = conn->rdma.initiator_depth; } if (pdata != NULL) { event->param.conn.private_data = &acc_rej_pdata; event->param.conn.private_data_len = sizeof(acc_rej_pdata); memset((uint8_t *)&acc_rej_pdata, 0, sizeof(acc_rej_pdata)); acc_rej_pdata.pd_accept.crqsize = conn->sq_depth; acc_rej_pdata.pd_accept.crqsize = conn->rdma.sq_depth; SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Accept Private Data Length %x\n", param->private_data_len); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Accept Private Data: recfmt %x\n", Loading Loading @@ -941,7 +941,7 @@ alloc_qp_rx_desc(struct spdk_nvmf_conn *conn) int rc; /* Allocate buffer for rx descriptors (RX WQE + Msg Buffer) */ for (i = 0; i < conn->sq_depth; i++) { for (i = 0; i < conn->rdma.sq_depth; i++) { rx_desc = rte_zmalloc("nvmf_rx_desc", sizeof(*rx_desc), 0); if (!rx_desc) { SPDK_ERRLOG("Unable to get rx desc object\n"); Loading Loading @@ -1049,7 +1049,7 @@ alloc_qp_tx_desc(struct spdk_nvmf_conn *conn) int rc; /* Initialize the tx descriptors */ for (i = 0; i < conn->cq_depth; i++) { for (i = 0; i < conn->rdma.cq_depth; i++) { tx_desc = rte_zmalloc("nvmf_tx_desc", sizeof(*tx_desc), 0); if (!tx_desc) { SPDK_ERRLOG("Unable to get tx desc object\n"); Loading lib/nvmf/rdma.h +5 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ struct spdk_nvmf_rdma_conn { struct ibv_cq *cq; struct ibv_qp *qp; uint16_t sq_depth; uint16_t cq_depth; uint8_t responder_resources; uint8_t initiator_depth; uint8_t pending_rdma_read_count; STAILQ_HEAD(qp_pending_desc, nvme_qp_tx_desc) qp_pending_desc; Loading Loading
lib/nvmf/conn.c +2 −2 Original line number Diff line number Diff line Loading @@ -399,7 +399,7 @@ nvmf_init_conn_properites(struct spdk_nvmf_conn *conn, conn->cntlid = response->status_code_specific.success.cntlid; session->max_connections_allowed = g_nvmf_tgt.MaxConnectionsPerSession; nvmf_init_session_properties(session, conn->sq_depth); nvmf_init_session_properties(session, conn->rdma.sq_depth); /* Update the session logical controller data with any * application fabric side limits Loading Loading @@ -495,7 +495,7 @@ static int nvmf_check_rdma_completions(struct spdk_nvmf_conn *conn) int cq_count = 0; int i; for (i = 0; i < conn->sq_depth; i++) { for (i = 0; i < conn->rdma.sq_depth; i++) { tx_desc = NULL; rc = ibv_poll_cq(conn->rdma.cq, 1, &wc); Loading
lib/nvmf/conn.h +0 −4 Original line number Diff line number Diff line Loading @@ -63,10 +63,6 @@ struct spdk_nvmf_conn { /* * values saved from fabric connect and private data */ uint8_t responder_resources; uint8_t initiator_depth; uint16_t sq_depth; uint16_t cq_depth; uint16_t qid; uint16_t cntlid; Loading
lib/nvmf/rdma.c +33 −33 Original line number Diff line number Diff line Loading @@ -128,7 +128,7 @@ nvmf_rdma_queue_init(struct spdk_nvmf_conn *conn, * completions. Three times the target connection SQ depth should be more * than enough. */ conn->rdma.cq = ibv_create_cq(verbs, (conn->sq_depth * 3), conn, conn->rdma.comp_channel, 0); conn->rdma.cq = ibv_create_cq(verbs, (conn->rdma.sq_depth * 3), conn, conn->rdma.comp_channel, 0); if (!conn->rdma.cq) { SPDK_ERRLOG("create cq error!\n"); goto cq_error; Loading @@ -138,8 +138,8 @@ nvmf_rdma_queue_init(struct spdk_nvmf_conn *conn, attr.qp_type = IBV_QPT_RC; attr.send_cq = conn->rdma.cq; attr.recv_cq = conn->rdma.cq; attr.cap.max_send_wr = conn->cq_depth; attr.cap.max_recv_wr = conn->sq_depth; attr.cap.max_send_wr = conn->rdma.cq_depth; attr.cap.max_recv_wr = conn->rdma.sq_depth; attr.cap.max_send_sge = NVMF_DEFAULT_TX_SGE; attr.cap.max_recv_sge = NVMF_DEFAULT_RX_SGE; Loading Loading @@ -303,7 +303,7 @@ nvmf_post_rdma_read(struct spdk_nvmf_conn *conn, * Queue the rdma read if it would exceed max outstanding * RDMA read limit. */ if (conn->rdma.pending_rdma_read_count == conn->initiator_depth) { if (conn->rdma.pending_rdma_read_count == conn->rdma.initiator_depth) { SPDK_TRACELOG(SPDK_TRACE_RDMA, "Insert rdma read into pending queue: tx_desc %p\n", tx_desc); STAILQ_REMOVE(&conn->rdma.qp_tx_active_desc, tx_desc, nvme_qp_tx_desc, link); Loading Loading @@ -430,8 +430,8 @@ nvmf_post_rdma_recv(struct spdk_nvmf_conn *conn, the SQ head counter opening up another RX recv slot. */ conn->sq_head < (conn->sq_depth - 1) ? (conn->sq_head++) : (conn->sq_head = 0); SPDK_TRACELOG(SPDK_TRACE_DEBUG, "sq_head %x, sq_depth %x\n", conn->sq_head, conn->sq_depth); conn->sq_head < (conn->rdma.sq_depth - 1) ? (conn->sq_head++) : (conn->sq_head = 0); SPDK_TRACELOG(SPDK_TRACE_DEBUG, "sq_head %x, sq_depth %x\n", conn->sq_head, conn->rdma.sq_depth); wr.wr_id = (uintptr_t)rx_desc; wr.next = NULL; Loading Loading @@ -531,8 +531,8 @@ nvmf_rdma_connect(struct rdma_cm_event *event) /* check for private data */ if (event->param.conn.private_data_len < sizeof(union spdk_nvmf_rdma_private_data)) { SPDK_TRACELOG(SPDK_TRACE_RDMA, "No private nvmf connection setup data\n"); conn->sq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->cq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->rdma.sq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ conn->rdma.cq_depth = SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH; /* assume max default */ } else { pdata = event->param.conn.private_data; if (pdata == NULL) { Loading @@ -542,17 +542,17 @@ nvmf_rdma_connect(struct rdma_cm_event *event) } /* Save private details for later validation and use */ conn->sq_depth = pdata->pd_request.hsqsize; conn->cq_depth = pdata->pd_request.hrqsize; conn->rdma.sq_depth = pdata->pd_request.hsqsize; conn->rdma.cq_depth = pdata->pd_request.hrqsize; conn->qid = pdata->pd_request.qid; /* double send queue size for R/W commands */ conn->cq_depth *= 2; conn->rdma.cq_depth *= 2; if (conn->qid > 0) { conn->type = CONN_TYPE_IOQ; } SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: QID %x\n", conn->qid); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: CQ Depth %x\n", conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: SQ Depth %x\n", conn->sq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: CQ Depth %x\n", conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Private Data: SQ Depth %x\n", conn->rdma.sq_depth); } /* adjust conn settings to device limits */ Loading @@ -562,15 +562,15 @@ nvmf_rdma_connect(struct rdma_cm_event *event) goto err2; } if (conn->cq_depth > ibdev_attr.max_cqe) { conn->cq_depth = ibdev_attr.max_cqe; if (conn->rdma.cq_depth > ibdev_attr.max_cqe) { conn->rdma.cq_depth = ibdev_attr.max_cqe; } if (conn->sq_depth > ibdev_attr.max_qp_wr) { conn->sq_depth = ibdev_attr.max_qp_wr; if (conn->rdma.sq_depth > ibdev_attr.max_qp_wr) { conn->rdma.sq_depth = ibdev_attr.max_qp_wr; } conn->sq_depth = nvmf_min(conn->sq_depth, conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted CQ Depth %x\n", conn->cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted SQ Depth %x\n", conn->sq_depth); conn->rdma.sq_depth = nvmf_min(conn->rdma.sq_depth, conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted CQ Depth %x\n", conn->rdma.cq_depth); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted SQ Depth %x\n", conn->rdma.sq_depth); if (conn_id->ps == RDMA_PS_TCP) { SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect flow control: %x\n", event->param.conn.flow_control); Loading @@ -584,16 +584,16 @@ nvmf_rdma_connect(struct rdma_cm_event *event) SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect SRQ %x\n", event->param.conn.srq); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect qp_num %x\n", event->param.conn.qp_num); conn->responder_resources = nvmf_min(event->param.conn.responder_resources, conn->rdma.responder_resources = nvmf_min(event->param.conn.responder_resources, ibdev_attr.max_qp_rd_atom); conn->initiator_depth = nvmf_min(event->param.conn.initiator_depth, conn->rdma.initiator_depth = nvmf_min(event->param.conn.initiator_depth, ibdev_attr.max_qp_init_rd_atom); if (event->param.conn.responder_resources != conn->responder_resources || event->param.conn.initiator_depth != conn->initiator_depth) { if (event->param.conn.responder_resources != conn->rdma.responder_resources || event->param.conn.initiator_depth != conn->rdma.initiator_depth) { SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted Responder Resources %x\n", conn->responder_resources); conn->rdma.responder_resources); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Adjusted Initiator Depth %x\n", conn->initiator_depth); conn->rdma.initiator_depth); } } Loading Loading @@ -643,14 +643,14 @@ nvmf_rdma_connect(struct rdma_cm_event *event) param = &event->param.conn; if (conn_id->ps == RDMA_PS_TCP) { event->param.conn.responder_resources = conn->responder_resources; event->param.conn.initiator_depth = conn->initiator_depth; event->param.conn.responder_resources = conn->rdma.responder_resources; event->param.conn.initiator_depth = conn->rdma.initiator_depth; } if (pdata != NULL) { event->param.conn.private_data = &acc_rej_pdata; event->param.conn.private_data_len = sizeof(acc_rej_pdata); memset((uint8_t *)&acc_rej_pdata, 0, sizeof(acc_rej_pdata)); acc_rej_pdata.pd_accept.crqsize = conn->sq_depth; acc_rej_pdata.pd_accept.crqsize = conn->rdma.sq_depth; SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Accept Private Data Length %x\n", param->private_data_len); SPDK_TRACELOG(SPDK_TRACE_RDMA, " Connect Accept Private Data: recfmt %x\n", Loading Loading @@ -941,7 +941,7 @@ alloc_qp_rx_desc(struct spdk_nvmf_conn *conn) int rc; /* Allocate buffer for rx descriptors (RX WQE + Msg Buffer) */ for (i = 0; i < conn->sq_depth; i++) { for (i = 0; i < conn->rdma.sq_depth; i++) { rx_desc = rte_zmalloc("nvmf_rx_desc", sizeof(*rx_desc), 0); if (!rx_desc) { SPDK_ERRLOG("Unable to get rx desc object\n"); Loading Loading @@ -1049,7 +1049,7 @@ alloc_qp_tx_desc(struct spdk_nvmf_conn *conn) int rc; /* Initialize the tx descriptors */ for (i = 0; i < conn->cq_depth; i++) { for (i = 0; i < conn->rdma.cq_depth; i++) { tx_desc = rte_zmalloc("nvmf_tx_desc", sizeof(*tx_desc), 0); if (!tx_desc) { SPDK_ERRLOG("Unable to get tx desc object\n"); Loading
lib/nvmf/rdma.h +5 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,11 @@ struct spdk_nvmf_rdma_conn { struct ibv_cq *cq; struct ibv_qp *qp; uint16_t sq_depth; uint16_t cq_depth; uint8_t responder_resources; uint8_t initiator_depth; uint8_t pending_rdma_read_count; STAILQ_HEAD(qp_pending_desc, nvme_qp_tx_desc) qp_pending_desc; Loading