From 0a61427ecce7f14620434dcd87f1661d8ee699e4 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 31 Jan 2022 22:53:03 +0900 Subject: [PATCH] nvme_rdma: Start qpair after resolving address and route when poll group is used Signed-off-by: Shuhei Matsumoto Change-Id: I0b0f314c98368247582f2dfcaf69f78e24d715f9 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11366 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk --- lib/nvme/nvme_rdma.c | 103 ++++++++++-------- test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c | 4 +- 2 files changed, 57 insertions(+), 50 deletions(-) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index e595da974..261dacda9 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -712,6 +712,60 @@ nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair, return rc; } +static int +nvme_rdma_resize_cq(struct nvme_rdma_qpair *rqpair, struct nvme_rdma_poller *poller) +{ + int current_num_wc, required_num_wc; + + required_num_wc = poller->required_num_wc + WC_PER_QPAIR(rqpair->num_entries); + current_num_wc = poller->current_num_wc; + if (current_num_wc < required_num_wc) { + current_num_wc = spdk_max(current_num_wc * 2, required_num_wc); + } + + if (poller->current_num_wc != current_num_wc) { + SPDK_DEBUGLOG(nvme, "Resize RDMA CQ from %d to %d\n", poller->current_num_wc, + current_num_wc); + if (ibv_resize_cq(poller->cq, current_num_wc)) { + SPDK_ERRLOG("RDMA CQ resize failed: errno %d: %s\n", errno, spdk_strerror(errno)); + return -1; + } + + poller->current_num_wc = current_num_wc; + } + + poller->required_num_wc = required_num_wc; + return 0; +} + +static int +nvme_rdma_poll_group_set_cq(struct spdk_nvme_qpair *qpair) +{ + struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair); + struct nvme_rdma_poll_group *group = nvme_rdma_poll_group(qpair->poll_group); + struct nvme_rdma_poller *poller; + + assert(rqpair->cq == NULL); + + STAILQ_FOREACH(poller, &group->pollers, link) { + if (poller->device == rqpair->cm_id->verbs) { + if (nvme_rdma_resize_cq(rqpair, poller)) { + return -EPROTO; + } + rqpair->cq = poller->cq; + rqpair->poller = poller; + break; + } + } + + if (rqpair->cq == NULL) { + SPDK_ERRLOG("Unable to find a cq for qpair %p on poll group %p\n", qpair, qpair->poll_group); + return -EINVAL; + } + + return 0; +} + static int nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair) { @@ -728,7 +782,7 @@ nvme_rdma_qpair_init(struct nvme_rdma_qpair *rqpair) if (rqpair->qpair.poll_group) { assert(!rqpair->cq); - rc = nvme_poll_group_connect_qpair(&rqpair->qpair); + rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair); if (rc) { SPDK_ERRLOG("Unable to activate the rdmaqpair.\n"); return -1; @@ -2701,57 +2755,10 @@ nvme_rdma_poll_group_get_qpair_by_id(struct nvme_rdma_poll_group *group, uint32_ return NULL; } -static int -nvme_rdma_resize_cq(struct nvme_rdma_qpair *rqpair, struct nvme_rdma_poller *poller) -{ - int current_num_wc, required_num_wc; - - required_num_wc = poller->required_num_wc + WC_PER_QPAIR(rqpair->num_entries); - current_num_wc = poller->current_num_wc; - if (current_num_wc < required_num_wc) { - current_num_wc = spdk_max(current_num_wc * 2, required_num_wc); - } - - if (poller->current_num_wc != current_num_wc) { - SPDK_DEBUGLOG(nvme, "Resize RDMA CQ from %d to %d\n", poller->current_num_wc, - current_num_wc); - if (ibv_resize_cq(poller->cq, current_num_wc)) { - SPDK_ERRLOG("RDMA CQ resize failed: errno %d: %s\n", errno, spdk_strerror(errno)); - return -1; - } - - poller->current_num_wc = current_num_wc; - } - - poller->required_num_wc = required_num_wc; - return 0; -} static int nvme_rdma_poll_group_connect_qpair(struct spdk_nvme_qpair *qpair) { - struct nvme_rdma_qpair *rqpair = nvme_rdma_qpair(qpair); - struct nvme_rdma_poll_group *group = nvme_rdma_poll_group(qpair->poll_group); - struct nvme_rdma_poller *poller; - - assert(rqpair->cq == NULL); - - STAILQ_FOREACH(poller, &group->pollers, link) { - if (poller->device == rqpair->cm_id->verbs) { - if (nvme_rdma_resize_cq(rqpair, poller)) { - return -EPROTO; - } - rqpair->cq = poller->cq; - rqpair->poller = poller; - break; - } - } - - if (rqpair->cq == NULL) { - SPDK_ERRLOG("Unable to find a cq for qpair %p on poll group %p\n", qpair, qpair->poll_group); - return -EINVAL; - } - return 0; } diff --git a/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c b/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c index 25c671c8a..eaddfd33d 100644 --- a/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c +++ b/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c @@ -1052,7 +1052,7 @@ test_nvme_rdma_poll_group_connect_disconnect_qpair(void) rc = nvme_rdma_poller_create(&group, contexts); SPDK_CU_ASSERT_FATAL(rc == 0); - rc = nvme_rdma_poll_group_connect_qpair(&rqpair->qpair); + rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair); CU_ASSERT(rc == 0); CU_ASSERT(rqpair->cq == (void *)0xFEEDBEEF); CU_ASSERT(rqpair->poller != NULL); @@ -1086,7 +1086,7 @@ test_nvme_rdma_poll_group_connect_disconnect_qpair(void) rqpair->qpair.state = NVME_QPAIR_DESTROYING; cm_id.verbs = (void *)0xDEADBEEF; - rc = nvme_rdma_poll_group_connect_qpair(&rqpair->qpair); + rc = nvme_rdma_poll_group_set_cq(&rqpair->qpair); CU_ASSERT(rc == -EINVAL); CU_ASSERT(rqpair->cq == NULL);