From 2600cd92f55209db6a6b7ea74daf50f20e50b7bd Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Tue, 15 Sep 2020 18:38:21 +0800 Subject: [PATCH] nvmf: revert 'commit ae207216fb1c ("nvmf: remove request exec backdoor")' spdk_nvmf_request_exec_fabrics() is still required because for coming vfio-user transport, Fabric commands are executed synchronously, and at that monment, the ADMIN queue was not in active state. Change-Id: I6c53950680d0ad0ab199f66e88ab34a0af46dc14 Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4234 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- include/spdk/nvmf_transport.h | 1 + lib/nvmf/ctrlr.c | 27 +++++++++++++++++++++++++++ lib/nvmf/spdk_nvmf.map | 1 + 3 files changed, 29 insertions(+) diff --git a/include/spdk/nvmf_transport.h b/include/spdk/nvmf_transport.h index 313680b04..3d784684a 100644 --- a/include/spdk/nvmf_transport.h +++ b/include/spdk/nvmf_transport.h @@ -429,6 +429,7 @@ int spdk_nvmf_request_get_buffers_multi(struct spdk_nvmf_request *req, bool spdk_nvmf_request_get_dif_ctx(struct spdk_nvmf_request *req, struct spdk_dif_ctx *dif_ctx); void spdk_nvmf_request_exec(struct spdk_nvmf_request *req); +void spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req); int spdk_nvmf_request_free(struct spdk_nvmf_request *req); int spdk_nvmf_request_complete(struct spdk_nvmf_request *req); diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 9a51d9271..399ae5f27 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -3497,6 +3497,33 @@ spdk_nvmf_request_complete(struct spdk_nvmf_request *req) return 0; } +void +spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req) +{ + struct spdk_nvmf_qpair *qpair = req->qpair; + struct spdk_nvmf_subsystem_poll_group *sgroup = NULL; + enum spdk_nvmf_request_exec_status status; + + if (qpair->ctrlr) { + sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id]; + } else if (spdk_unlikely(nvmf_request_is_fabric_connect(req))) { + sgroup = nvmf_subsystem_pg_from_connect_cmd(req); + } + + assert(sgroup != NULL); + sgroup->io_outstanding++; + + /* Place the request on the outstanding list so we can keep track of it */ + TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); + + assert(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC); + status = nvmf_ctrlr_process_fabrics_cmd(req); + + if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) { + _nvmf_request_complete(req); + } +} + void spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { diff --git a/lib/nvmf/spdk_nvmf.map b/lib/nvmf/spdk_nvmf.map index 6e5953f1f..349f8fbc4 100644 --- a/lib/nvmf/spdk_nvmf.map +++ b/lib/nvmf/spdk_nvmf.map @@ -109,6 +109,7 @@ spdk_nvmf_request_get_buffers; spdk_nvmf_request_get_buffers_multi; spdk_nvmf_request_get_dif_ctx; + spdk_nvmf_request_exec_fabrics; spdk_nvmf_request_exec; spdk_nvmf_request_free; spdk_nvmf_request_complete;