From 1b17e4ee35802f43d301f1d982b06148e3c5dc2d Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Tue, 7 Jun 2016 15:21:21 -0700 Subject: [PATCH] nvmf: Combine nvmf_rdma_conn_init and nvmf_rdma_qp_init They are only ever called in sequence and do related operations. Change-Id: I825abe08deba1dafb405757bb4f2d52062a801ca Signed-off-by: Ben Walker --- lib/nvmf/rdma.c | 69 +++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 084fe5c6c9..ee6e5972e7 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -68,31 +68,32 @@ static struct rdma_cm_id *g_cm_id = NULL; */ static int -nvmf_rdma_conn_init(struct spdk_nvmf_conn *conn, - struct ibv_context *verbs) +nvmf_rdma_queue_init(struct spdk_nvmf_conn *conn, + struct ibv_context *verbs) { - int rc; + int rc; + struct ibv_qp_init_attr attr; if (conn->ctx) { - SPDK_ERRLOG("rdma_conn_init: context already set!\n"); + SPDK_ERRLOG("context already set!\n"); goto return_error; } conn->ctx = verbs; conn->pd = ibv_alloc_pd(verbs); if (!conn->pd) { - SPDK_ERRLOG("rdma_conn_init: alloc pd error!\n"); + SPDK_ERRLOG("alloc pd error!\n"); goto return_error; } conn->comp_channel = ibv_create_comp_channel(verbs); if (!conn->comp_channel) { - SPDK_ERRLOG("rdma_conn_init: create completion channel error!\n"); + SPDK_ERRLOG("create completion channel error!\n"); goto comp_ch_error; } rc = fcntl(conn->comp_channel->fd, F_SETFL, O_NONBLOCK); if (rc < 0) { - SPDK_ERRLOG("rdma_conn_init: fcntl to set comp channel to non-blocking failed\n"); + SPDK_ERRLOG("fcntl to set comp channel to non-blocking failed\n"); goto comp_ch_error; } @@ -103,10 +104,26 @@ nvmf_rdma_conn_init(struct spdk_nvmf_conn *conn, */ conn->cq = ibv_create_cq(verbs, (conn->sq_depth * 3), conn, conn->comp_channel, 0); if (!conn->cq) { - SPDK_ERRLOG("rdma_conn_init: create cq error!\n"); + SPDK_ERRLOG("create cq error!\n"); goto cq_error; } + memset(&attr, 0, sizeof(struct ibv_qp_init_attr)); + attr.qp_type = IBV_QPT_RC; + attr.send_cq = conn->cq; + attr.recv_cq = conn->cq; + attr.cap.max_send_wr = conn->cq_depth; + attr.cap.max_recv_wr = conn->sq_depth; + attr.cap.max_send_sge = NVMF_DEFAULT_TX_SGE; + attr.cap.max_recv_sge = NVMF_DEFAULT_RX_SGE; + + rc = rdma_create_qp(conn->cm_id, conn->pd, &attr); + if (rc) { + SPDK_ERRLOG("rdma_create_qp failed\n"); + goto cq_error; + } + conn->qp = conn->cm_id->qp; + return 0; cq_error: @@ -209,32 +226,6 @@ nvmf_rdma_conn_cleanup(struct spdk_nvmf_conn *conn) rdma_destroy_id(conn->cm_id); } -static int -nvmf_rdma_qp_init(struct spdk_nvmf_conn *conn) -{ - struct ibv_qp_init_attr attr; - int ret; - - memset(&attr, 0, sizeof(struct ibv_qp_init_attr)); - - attr.qp_type = IBV_QPT_RC; - attr.send_cq = conn->cq; - attr.recv_cq = conn->cq; - attr.cap.max_send_wr = conn->cq_depth; - attr.cap.max_recv_wr = conn->sq_depth; - attr.cap.max_send_sge = NVMF_DEFAULT_TX_SGE; - attr.cap.max_recv_sge = NVMF_DEFAULT_RX_SGE; - - ret = rdma_create_qp(conn->cm_id, conn->pd, &attr); - if (ret) { - SPDK_ERRLOG("rdma_create_qp failed\n"); - return -1; - } - conn->qp = conn->cm_id->qp; - - return 0; -} - int nvmf_post_rdma_read(struct spdk_nvmf_conn *conn, struct nvme_qp_tx_desc *tx_desc) @@ -560,21 +551,13 @@ nvmf_rdma_cm_connect(struct rdma_cm_event *event) } } - rc = nvmf_rdma_conn_init(conn, conn_id->verbs); + rc = nvmf_rdma_queue_init(conn, conn_id->verbs); if (rc) { SPDK_ERRLOG("connect request: rdma conn init failure!\n"); goto err2; } SPDK_TRACELOG(SPDK_TRACE_DEBUG, "NVMf fabric connection initialized\n"); - /* Allocate the AQ QP Channel */ - rc = nvmf_rdma_qp_init(conn); - if (rc) { - SPDK_ERRLOG("Unable to allocate connection qp\n"); - goto err2; - } - SPDK_TRACELOG(SPDK_TRACE_DEBUG, "QPs allocated\n"); - STAILQ_INIT(&conn->qp_pending_desc); STAILQ_INIT(&conn->qp_rx_desc); STAILQ_INIT(&conn->qp_tx_desc);