From 3ada37faa3eca4a988a2e67f222b971aabbb68a3 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 3 Aug 2021 17:13:26 +0200 Subject: [PATCH] nvme: use poll_group_process_completions in connect_qpair If a qpair is part of a poll group and it's not configured in the async mode, it should be using poll group's process_completions variant. Additionally, connecting qpairs to the poll group was moved up, so that qpairs are already on the connected qpairs queue when waiting for the connection to complete. Signed-off-by: Konrad Sztyber Change-Id: I08f75bd61a566d1ab60029b6202d9337df75733f Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9074 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Reviewed-by: Monica Kenguva --- lib/nvme/nvme_transport.c | 31 ++++++++++++------- .../nvme/nvme_transport.c/nvme_transport_ut.c | 3 ++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 6fcefd151..3bc6f9694 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -350,7 +350,7 @@ nvme_transport_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_ } static void -nvme_transport_connect_qpair_fail(struct spdk_nvme_qpair *qpair) +nvme_transport_connect_qpair_fail(struct spdk_nvme_qpair *qpair, void *unused) { struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; @@ -380,16 +380,6 @@ nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nv goto err; } - if (!qpair->async) { - /* Busy wait until the qpair exits the connecting state */ - while (nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING) { - rc = spdk_nvme_qpair_process_completions(qpair, 0); - if (rc < 0) { - goto err; - } - } - } - if (qpair->poll_group) { rc = nvme_poll_group_connect_qpair(qpair); if (rc) { @@ -397,9 +387,26 @@ nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nv } } + if (!qpair->async) { + /* Busy wait until the qpair exits the connecting state */ + while (nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING) { + if (qpair->poll_group) { + rc = spdk_nvme_poll_group_process_completions( + qpair->poll_group->group, 0, + nvme_transport_connect_qpair_fail); + } else { + rc = spdk_nvme_qpair_process_completions(qpair, 0); + } + + if (rc < 0) { + goto err; + } + } + } + return 0; err: - nvme_transport_connect_qpair_fail(qpair); + nvme_transport_connect_qpair_fail(qpair, NULL); return rc; } diff --git a/test/unit/lib/nvme/nvme_transport.c/nvme_transport_ut.c b/test/unit/lib/nvme/nvme_transport.c/nvme_transport_ut.c index 5c947b5ca..ae93a9d31 100644 --- a/test/unit/lib/nvme/nvme_transport.c/nvme_transport_ut.c +++ b/test/unit/lib/nvme/nvme_transport.c/nvme_transport_ut.c @@ -46,6 +46,9 @@ DEFINE_STUB(spdk_nvme_transport_id_trtype_str, const char *, (enum spdk_nvme_transport_type trtype), NULL); DEFINE_STUB(spdk_nvme_qpair_process_completions, int32_t, (struct spdk_nvme_qpair *qpair, uint32_t max_completions), 0); +DEFINE_STUB(spdk_nvme_poll_group_process_completions, int64_t, (struct spdk_nvme_poll_group *group, + uint32_t completions_per_qpair, + spdk_nvme_disconnected_qpair_cb disconnected_qpair_cb), 0); static void ut_construct_transport(struct spdk_nvme_transport *transport, const char name[])