diff --git a/lib/nvmf/Makefile b/lib/nvmf/Makefile index e600c4e25..c767b2933 100644 --- a/lib/nvmf/Makefile +++ b/lib/nvmf/Makefile @@ -35,8 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk C_SRCS = ctrlr.c ctrlr_discovery.c ctrlr_bdev.c \ - subsystem.c nvmf.c \ - request.c transport.c tcp.c + subsystem.c nvmf.c transport.c tcp.c C_SRCS-$(CONFIG_RDMA) += rdma.c LIBNAME = nvmf diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index b306500ea..ff3ae8a74 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -2015,3 +2015,147 @@ spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) return spdk_nvmf_bdev_ctrlr_nvme_passthru_io(bdev, desc, ch, req); } } + +static void +spdk_nvmf_qpair_request_cleanup(struct spdk_nvmf_qpair *qpair) +{ + if (qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING) { + assert(qpair->state_cb != NULL); + + if (TAILQ_EMPTY(&qpair->outstanding)) { + qpair->state_cb(qpair->state_cb_arg, 0); + } + } else { + assert(qpair->state == SPDK_NVMF_QPAIR_ACTIVE); + } +} + +int +spdk_nvmf_request_free(struct spdk_nvmf_request *req) +{ + struct spdk_nvmf_qpair *qpair = req->qpair; + + TAILQ_REMOVE(&qpair->outstanding, req, link); + if (spdk_nvmf_transport_req_free(req)) { + SPDK_ERRLOG("Unable to free transport level request resources.\n"); + } + + spdk_nvmf_qpair_request_cleanup(qpair); + + return 0; +} + +int +spdk_nvmf_request_complete(struct spdk_nvmf_request *req) +{ + struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; + struct spdk_nvmf_qpair *qpair; + + rsp->sqid = 0; + rsp->status.p = 0; + rsp->cid = req->cmd->nvme_cmd.cid; + + qpair = req->qpair; + + SPDK_DEBUGLOG(SPDK_LOG_NVMF, + "cpl: cid=%u cdw0=0x%08x rsvd1=%u status=0x%04x\n", + rsp->cid, rsp->cdw0, rsp->rsvd1, + *(uint16_t *)&rsp->status); + + TAILQ_REMOVE(&qpair->outstanding, req, link); + if (spdk_nvmf_transport_req_complete(req)) { + SPDK_ERRLOG("Transport request completion error!\n"); + } + + spdk_nvmf_qpair_request_cleanup(qpair); + + return 0; +} + +static void +nvmf_trace_command(union nvmf_h2c_msg *h2c_msg, bool is_admin_queue) +{ + struct spdk_nvmf_capsule_cmd *cap_hdr = &h2c_msg->nvmf_cmd; + struct spdk_nvme_cmd *cmd = &h2c_msg->nvme_cmd; + struct spdk_nvme_sgl_descriptor *sgl = &cmd->dptr.sgl1; + uint8_t opc; + + if (cmd->opc == SPDK_NVME_OPC_FABRIC) { + opc = cap_hdr->fctype; + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "%s Fabrics cmd: fctype 0x%02x cid %u\n", + is_admin_queue ? "Admin" : "I/O", + cap_hdr->fctype, cap_hdr->cid); + } else { + opc = cmd->opc; + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "%s cmd: opc 0x%02x fuse %u cid %u nsid %u cdw10 0x%08x\n", + is_admin_queue ? "Admin" : "I/O", + cmd->opc, cmd->fuse, cmd->cid, cmd->nsid, cmd->cdw10); + if (cmd->mptr) { + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "mptr 0x%" PRIx64 "\n", cmd->mptr); + } + if (cmd->psdt != SPDK_NVME_PSDT_SGL_MPTR_CONTIG && + cmd->psdt != SPDK_NVME_PSDT_SGL_MPTR_SGL) { + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "psdt %u\n", cmd->psdt); + } + } + + if (spdk_nvme_opc_get_data_transfer(opc) != SPDK_NVME_DATA_NONE) { + if (sgl->generic.type == SPDK_NVME_SGL_TYPE_KEYED_DATA_BLOCK) { + SPDK_DEBUGLOG(SPDK_LOG_NVMF, + "SGL: Keyed%s: addr 0x%" PRIx64 " key 0x%x len 0x%x\n", + sgl->generic.subtype == SPDK_NVME_SGL_SUBTYPE_INVALIDATE_KEY ? " (Inv)" : "", + sgl->address, sgl->keyed.key, sgl->keyed.length); + } else if (sgl->generic.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK) { + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "SGL: Data block: %s 0x%" PRIx64 " len 0x%x\n", + sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_OFFSET ? "offs" : "addr", + sgl->address, sgl->unkeyed.length); + } else { + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "SGL type 0x%x subtype 0x%x\n", + sgl->generic.type, sgl->generic.subtype); + } + } +} + +void +spdk_nvmf_request_exec(struct spdk_nvmf_request *req) +{ + struct spdk_nvmf_qpair *qpair = req->qpair; + spdk_nvmf_request_exec_status status; + + nvmf_trace_command(req->cmd, spdk_nvmf_qpair_is_admin_queue(qpair)); + + if (qpair->state != SPDK_NVMF_QPAIR_ACTIVE) { + req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; + req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR; + /* Place the request on the outstanding list so we can keep track of it */ + TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); + spdk_nvmf_request_complete(req); + return; + } + + /* Check if the subsystem is paused (if there is a subsystem) */ + if (qpair->ctrlr) { + struct spdk_nvmf_subsystem_poll_group *sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id]; + if (sgroup->state != SPDK_NVMF_SUBSYSTEM_ACTIVE) { + /* The subsystem is not currently active. Queue this request. */ + TAILQ_INSERT_TAIL(&sgroup->queued, req, link); + return; + } + + } + + /* Place the request on the outstanding list so we can keep track of it */ + TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); + + if (spdk_unlikely(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC)) { + status = spdk_nvmf_ctrlr_process_fabrics_cmd(req); + } else if (spdk_unlikely(spdk_nvmf_qpair_is_admin_queue(qpair))) { + status = spdk_nvmf_ctrlr_process_admin_cmd(req); + } else { + status = spdk_nvmf_ctrlr_process_io_cmd(req); + } + + if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) { + spdk_nvmf_request_complete(req); + } +} diff --git a/lib/nvmf/request.c b/lib/nvmf/request.c deleted file mode 100644 index 88b6b9a95..000000000 --- a/lib/nvmf/request.c +++ /dev/null @@ -1,190 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) Intel Corporation. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "spdk/stdinc.h" - -#include "nvmf_internal.h" -#include "transport.h" - -#include "spdk/thread.h" -#include "spdk/likely.h" -#include "spdk/nvme.h" -#include "spdk/nvmf_spec.h" -#include "spdk/trace.h" - -#include "spdk_internal/assert.h" -#include "spdk_internal/log.h" - -static void -spdk_nvmf_qpair_request_cleanup(struct spdk_nvmf_qpair *qpair) -{ - if (qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING) { - assert(qpair->state_cb != NULL); - - if (TAILQ_EMPTY(&qpair->outstanding)) { - qpair->state_cb(qpair->state_cb_arg, 0); - } - } else { - assert(qpair->state == SPDK_NVMF_QPAIR_ACTIVE); - } -} - -int -spdk_nvmf_request_free(struct spdk_nvmf_request *req) -{ - struct spdk_nvmf_qpair *qpair = req->qpair; - - TAILQ_REMOVE(&qpair->outstanding, req, link); - if (spdk_nvmf_transport_req_free(req)) { - SPDK_ERRLOG("Unable to free transport level request resources.\n"); - } - - spdk_nvmf_qpair_request_cleanup(qpair); - - return 0; -} - -int -spdk_nvmf_request_complete(struct spdk_nvmf_request *req) -{ - struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; - struct spdk_nvmf_qpair *qpair; - - rsp->sqid = 0; - rsp->status.p = 0; - rsp->cid = req->cmd->nvme_cmd.cid; - - qpair = req->qpair; - - SPDK_DEBUGLOG(SPDK_LOG_NVMF, - "cpl: cid=%u cdw0=0x%08x rsvd1=%u status=0x%04x\n", - rsp->cid, rsp->cdw0, rsp->rsvd1, - *(uint16_t *)&rsp->status); - - TAILQ_REMOVE(&qpair->outstanding, req, link); - if (spdk_nvmf_transport_req_complete(req)) { - SPDK_ERRLOG("Transport request completion error!\n"); - } - - spdk_nvmf_qpair_request_cleanup(qpair); - - return 0; -} - -static void -nvmf_trace_command(union nvmf_h2c_msg *h2c_msg, bool is_admin_queue) -{ - struct spdk_nvmf_capsule_cmd *cap_hdr = &h2c_msg->nvmf_cmd; - struct spdk_nvme_cmd *cmd = &h2c_msg->nvme_cmd; - struct spdk_nvme_sgl_descriptor *sgl = &cmd->dptr.sgl1; - uint8_t opc; - - if (cmd->opc == SPDK_NVME_OPC_FABRIC) { - opc = cap_hdr->fctype; - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "%s Fabrics cmd: fctype 0x%02x cid %u\n", - is_admin_queue ? "Admin" : "I/O", - cap_hdr->fctype, cap_hdr->cid); - } else { - opc = cmd->opc; - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "%s cmd: opc 0x%02x fuse %u cid %u nsid %u cdw10 0x%08x\n", - is_admin_queue ? "Admin" : "I/O", - cmd->opc, cmd->fuse, cmd->cid, cmd->nsid, cmd->cdw10); - if (cmd->mptr) { - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "mptr 0x%" PRIx64 "\n", cmd->mptr); - } - if (cmd->psdt != SPDK_NVME_PSDT_SGL_MPTR_CONTIG && - cmd->psdt != SPDK_NVME_PSDT_SGL_MPTR_SGL) { - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "psdt %u\n", cmd->psdt); - } - } - - if (spdk_nvme_opc_get_data_transfer(opc) != SPDK_NVME_DATA_NONE) { - if (sgl->generic.type == SPDK_NVME_SGL_TYPE_KEYED_DATA_BLOCK) { - SPDK_DEBUGLOG(SPDK_LOG_NVMF, - "SGL: Keyed%s: addr 0x%" PRIx64 " key 0x%x len 0x%x\n", - sgl->generic.subtype == SPDK_NVME_SGL_SUBTYPE_INVALIDATE_KEY ? " (Inv)" : "", - sgl->address, sgl->keyed.key, sgl->keyed.length); - } else if (sgl->generic.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK) { - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "SGL: Data block: %s 0x%" PRIx64 " len 0x%x\n", - sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_OFFSET ? "offs" : "addr", - sgl->address, sgl->unkeyed.length); - } else { - SPDK_DEBUGLOG(SPDK_LOG_NVMF, "SGL type 0x%x subtype 0x%x\n", - sgl->generic.type, sgl->generic.subtype); - } - } -} - -void -spdk_nvmf_request_exec(struct spdk_nvmf_request *req) -{ - struct spdk_nvmf_qpair *qpair = req->qpair; - spdk_nvmf_request_exec_status status; - - nvmf_trace_command(req->cmd, spdk_nvmf_qpair_is_admin_queue(qpair)); - - if (qpair->state != SPDK_NVMF_QPAIR_ACTIVE) { - req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; - req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR; - /* Place the request on the outstanding list so we can keep track of it */ - TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); - spdk_nvmf_request_complete(req); - return; - } - - /* Check if the subsystem is paused (if there is a subsystem) */ - if (qpair->ctrlr) { - struct spdk_nvmf_subsystem_poll_group *sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id]; - if (sgroup->state != SPDK_NVMF_SUBSYSTEM_ACTIVE) { - /* The subsystem is not currently active. Queue this request. */ - TAILQ_INSERT_TAIL(&sgroup->queued, req, link); - return; - } - - } - - /* Place the request on the outstanding list so we can keep track of it */ - TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); - - if (spdk_unlikely(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC)) { - status = spdk_nvmf_ctrlr_process_fabrics_cmd(req); - } else if (spdk_unlikely(spdk_nvmf_qpair_is_admin_queue(qpair))) { - status = spdk_nvmf_ctrlr_process_admin_cmd(req); - } else { - status = spdk_nvmf_ctrlr_process_io_cmd(req); - } - - if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) { - spdk_nvmf_request_complete(req); - } -} diff --git a/test/unit/lib/nvmf/Makefile b/test/unit/lib/nvmf/Makefile index e822fc0da..0f9549dd4 100644 --- a/test/unit/lib/nvmf/Makefile +++ b/test/unit/lib/nvmf/Makefile @@ -34,7 +34,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -DIRS-y = tcp.c request.c ctrlr.c subsystem.c ctrlr_discovery.c ctrlr_bdev.c +DIRS-y = tcp.c ctrlr.c subsystem.c ctrlr_discovery.c ctrlr_bdev.c DIRS-$(CONFIG_RDMA) += rdma.c diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 62a7a4716..2b8ce4a70 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -100,11 +100,6 @@ DEFINE_STUB(spdk_nvmf_ctrlr_write_zeroes_supported, DEFINE_STUB_V(spdk_nvmf_get_discovery_log_page, (struct spdk_nvmf_tgt *tgt, struct iovec *iov, uint32_t iovcnt, uint64_t offset, uint32_t length)); -DEFINE_STUB(spdk_nvmf_request_complete, - int, - (struct spdk_nvmf_request *req), - -1); - DEFINE_STUB(spdk_nvmf_qpair_get_listen_trid, int, (struct spdk_nvmf_qpair *qpair, struct spdk_nvme_transport_id *trid), @@ -156,6 +151,11 @@ DEFINE_STUB(spdk_nvmf_bdev_ctrlr_nvme_passthru_io, struct spdk_nvmf_request *req), 0); +DEFINE_STUB(spdk_nvmf_transport_req_complete, + int, + (struct spdk_nvmf_request *req), + 0); + int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx) { @@ -313,6 +313,8 @@ test_connect(void) memset(&qpair, 0, sizeof(qpair)); qpair.transport = &transport; qpair.group = &group; + qpair.state = SPDK_NVMF_QPAIR_ACTIVE; + TAILQ_INIT(&qpair.outstanding); memset(&connect_data, 0, sizeof(connect_data)); memcpy(connect_data.hostid, hostid, sizeof(hostid)); @@ -352,6 +354,7 @@ test_connect(void) /* Valid admin connect command */ memset(&rsp, 0, sizeof(rsp)); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -365,6 +368,7 @@ test_connect(void) /* Invalid data length */ memset(&rsp, 0, sizeof(rsp)); req.length = sizeof(connect_data) - 1; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -376,6 +380,7 @@ test_connect(void) /* Invalid recfmt */ memset(&rsp, 0, sizeof(rsp)); cmd.connect_cmd.recfmt = 1234; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -387,6 +392,7 @@ test_connect(void) /* Unterminated subnqn */ memset(&rsp, 0, sizeof(rsp)); memset(connect_data.subnqn, 'a', sizeof(connect_data.subnqn)); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -400,6 +406,7 @@ test_connect(void) /* Subsystem not found */ memset(&rsp, 0, sizeof(rsp)); MOCK_SET(spdk_nvmf_tgt_find_subsystem, NULL); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -413,6 +420,7 @@ test_connect(void) /* Unterminated hostnqn */ memset(&rsp, 0, sizeof(rsp)); memset(connect_data.hostnqn, 'b', sizeof(connect_data.hostnqn)); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -426,6 +434,7 @@ test_connect(void) /* Host not allowed */ memset(&rsp, 0, sizeof(rsp)); MOCK_SET(spdk_nvmf_subsystem_host_allowed, false); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -437,6 +446,7 @@ test_connect(void) /* Invalid sqsize == 0 */ memset(&rsp, 0, sizeof(rsp)); cmd.connect_cmd.sqsize = 0; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -450,6 +460,7 @@ test_connect(void) /* Invalid sqsize > max_queue_depth */ memset(&rsp, 0, sizeof(rsp)); cmd.connect_cmd.sqsize = 64; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -463,6 +474,7 @@ test_connect(void) /* Invalid cntlid for admin queue */ memset(&rsp, 0, sizeof(rsp)); connect_data.cntlid = 0x1234; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); @@ -480,6 +492,7 @@ test_connect(void) memset(&rsp, 0, sizeof(rsp)); MOCK_SET(spdk_nvmf_subsystem_get_ctrlr, &ctrlr); cmd.connect_cmd.qid = 1; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -490,6 +503,7 @@ test_connect(void) /* Non-existent controller */ memset(&rsp, 0, sizeof(rsp)); MOCK_SET(spdk_nvmf_subsystem_get_ctrlr, NULL); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -504,6 +518,7 @@ test_connect(void) memset(&rsp, 0, sizeof(rsp)); subsystem.subtype = SPDK_NVMF_SUBTYPE_DISCOVERY; subsystem.state = SPDK_NVMF_SUBSYSTEM_ACTIVE; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -517,6 +532,7 @@ test_connect(void) /* I/O connect to disabled controller */ memset(&rsp, 0, sizeof(rsp)); ctrlr.vcprop.cc.bits.en = 0; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -530,6 +546,7 @@ test_connect(void) /* I/O connect with invalid IOSQES */ memset(&rsp, 0, sizeof(rsp)); ctrlr.vcprop.cc.bits.iosqes = 3; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -543,6 +560,7 @@ test_connect(void) /* I/O connect with invalid IOCQES */ memset(&rsp, 0, sizeof(rsp)); ctrlr.vcprop.cc.bits.iocqes = 3; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -558,6 +576,7 @@ test_connect(void) spdk_bit_array_set(ctrlr.qpair_mask, 0); spdk_bit_array_set(ctrlr.qpair_mask, 1); spdk_bit_array_set(ctrlr.qpair_mask, 2); + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); @@ -575,6 +594,7 @@ test_connect(void) qpair2.qid = 1; spdk_bit_array_set(ctrlr.qpair_mask, 1); cmd.connect_cmd.qid = 1; + TAILQ_INSERT_TAIL(&qpair.outstanding, &req, link); rc = spdk_nvmf_ctrlr_connect(&req); poll_threads(); CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS); diff --git a/test/unit/lib/nvmf/request.c/.gitignore b/test/unit/lib/nvmf/request.c/.gitignore deleted file mode 100644 index 7f06e410f..000000000 --- a/test/unit/lib/nvmf/request.c/.gitignore +++ /dev/null @@ -1 +0,0 @@ -request_ut diff --git a/test/unit/lib/nvmf/request.c/Makefile b/test/unit/lib/nvmf/request.c/Makefile deleted file mode 100644 index 0c683cff0..000000000 --- a/test/unit/lib/nvmf/request.c/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# -# BSD LICENSE -# -# Copyright (c) Intel Corporation. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Intel Corporation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../../../..) - -TEST_FILE = request_ut.c - -include $(SPDK_ROOT_DIR)/mk/spdk.unittest.mk diff --git a/test/unit/lib/nvmf/request.c/request_ut.c b/test/unit/lib/nvmf/request.c/request_ut.c deleted file mode 100644 index bd21fa634..000000000 --- a/test/unit/lib/nvmf/request.c/request_ut.c +++ /dev/null @@ -1,153 +0,0 @@ -/*- - * BSD LICENSE - * - * Copyright (c) Intel Corporation. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "spdk/stdinc.h" - -#include "spdk_cunit.h" - -#include "nvmf/request.c" - -SPDK_LOG_REGISTER_COMPONENT("nvmf", SPDK_LOG_NVMF) - -int -spdk_nvmf_transport_req_free(struct spdk_nvmf_request *req) -{ - return 0; -} - -int -spdk_nvmf_transport_req_complete(struct spdk_nvmf_request *req) -{ - return 0; -} - -int -spdk_nvmf_ctrlr_process_fabrics_cmd(struct spdk_nvmf_request *req) -{ - return -1; -} - -int -spdk_nvmf_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req) -{ - return -1; -} - -int -spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) -{ - return -1; -} - -int -spdk_nvme_ctrlr_cmd_admin_raw(struct spdk_nvme_ctrlr *ctrlr, - struct spdk_nvme_cmd *cmd, - void *buf, uint32_t len, - spdk_nvme_cmd_cb cb_fn, void *cb_arg) -{ - return -1; -} - -int -spdk_nvme_ctrlr_cmd_io_raw(struct spdk_nvme_ctrlr *ctrlr, - struct spdk_nvme_qpair *qpair, - struct spdk_nvme_cmd *cmd, - void *buf, uint32_t len, - spdk_nvme_cmd_cb cb_fn, void *cb_arg) -{ - return -1; -} - -uint32_t -spdk_nvme_ctrlr_get_num_ns(struct spdk_nvme_ctrlr *ctrlr) -{ - return 0; -} - -union spdk_nvme_vs_register spdk_nvme_ctrlr_get_regs_vs(struct spdk_nvme_ctrlr *ctrlr) -{ - union spdk_nvme_vs_register vs; - - vs.raw = 0; - return vs; -} - -bool -spdk_nvme_ns_is_active(struct spdk_nvme_ns *ns) -{ - return false; -} - -struct spdk_nvme_ns *spdk_nvme_ctrlr_get_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t ns_id) -{ - return NULL; -} - -int -spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx) -{ - return 0; -} - -static void -test_placeholder(void) -{ -} - -int main(int argc, char **argv) -{ - CU_pSuite suite = NULL; - unsigned int num_failures; - - if (CU_initialize_registry() != CUE_SUCCESS) { - return CU_get_error(); - } - - suite = CU_add_suite("nvmf", NULL, NULL); - if (suite == NULL) { - CU_cleanup_registry(); - return CU_get_error(); - } - - if ( - CU_add_test(suite, "placeholder", test_placeholder) == NULL) { - CU_cleanup_registry(); - return CU_get_error(); - } - - CU_basic_set_mode(CU_BRM_VERBOSE); - CU_basic_run_tests(); - num_failures = CU_get_number_of_failures(); - CU_cleanup_registry(); - return num_failures; -} diff --git a/test/unit/lib/nvmf/tcp.c/tcp_ut.c b/test/unit/lib/nvmf/tcp.c/tcp_ut.c index 1bc87d59b..132ae6309 100644 --- a/test/unit/lib/nvmf/tcp.c/tcp_ut.c +++ b/test/unit/lib/nvmf/tcp.c/tcp_ut.c @@ -117,16 +117,6 @@ DEFINE_STUB(spdk_nvmf_ctrlr_write_zeroes_supported, (struct spdk_nvmf_ctrlr *ctrlr), false); -DEFINE_STUB(spdk_nvmf_request_complete, - int, - (struct spdk_nvmf_request *req), - -1); - -DEFINE_STUB(spdk_nvmf_request_free, - int, - (struct spdk_nvmf_request *req), - -1); - DEFINE_STUB(spdk_nvmf_bdev_ctrlr_read_cmd, int, (struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch, @@ -163,6 +153,11 @@ DEFINE_STUB(spdk_nvmf_bdev_ctrlr_nvme_passthru_io, struct spdk_nvmf_request *req), 0); +DEFINE_STUB(spdk_nvmf_transport_req_complete, + int, + (struct spdk_nvmf_request *req), + 0); + struct spdk_trace_histories *g_trace_histories; struct spdk_bdev { @@ -228,11 +223,6 @@ spdk_trace_add_register_fn(struct spdk_trace_register_fn *reg_fn) { } -void -spdk_nvmf_request_exec(struct spdk_nvmf_request *req) -{ -} - static void test_nvmf_tcp_create(void) { diff --git a/test/unit/unittest.sh b/test/unit/unittest.sh index e52b6c914..17a3f7693 100755 --- a/test/unit/unittest.sh +++ b/test/unit/unittest.sh @@ -107,7 +107,6 @@ $valgrind $testdir/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut if grep -q '#define SPDK_CONFIG_RDMA 1' $rootdir/include/spdk/config.h; then $valgrind $testdir/lib/nvmf/rdma.c/rdma_ut fi -$valgrind $testdir/lib/nvmf/request.c/request_ut $valgrind $testdir/lib/nvmf/subsystem.c/subsystem_ut $valgrind $testdir/lib/nvmf/tcp.c/tcp_ut