From 5eb53691c350b1061cc88628b037cd9eb51f50d0 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Sat, 13 Mar 2021 07:32:07 +0900 Subject: [PATCH] ut/bdev_nvme: Add test casde for admin command passthrough Add test case for admin command passthrough to test redirection of completion processing. Change the type of opc to uint16_t to cover admin commands. Signed-off-by: Shuhei Matsumoto Change-Id: Id01cb924e7778878dcfaf8766b05af1ae52623eb Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6882 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Aleksey Marchuk Reviewed-by: Community-CI: Mellanox Build Bot --- .../lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c | 81 ++++++++++++++----- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c index c9cfca8ae..a94fb8433 100644 --- a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c +++ b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c @@ -68,9 +68,6 @@ DEFINE_STUB(spdk_nvme_ctrlr_set_trid, int, (struct spdk_nvme_ctrlr *ctrlr, DEFINE_STUB_V(spdk_nvme_ctrlr_set_remove_cb, (struct spdk_nvme_ctrlr *ctrlr, spdk_nvme_remove_cb remove_cb, void *remove_ctx)); -DEFINE_STUB(spdk_nvme_ctrlr_process_admin_completions, int32_t, - (struct spdk_nvme_ctrlr *ctrlr), 0); - DEFINE_STUB(spdk_nvme_ctrlr_get_flags, uint64_t, (struct spdk_nvme_ctrlr *ctrlr), 0); void @@ -95,10 +92,6 @@ DEFINE_STUB_V(spdk_nvme_ctrlr_register_timeout_callback, (struct spdk_nvme_ctrlr DEFINE_STUB(spdk_nvme_ctrlr_is_ocssd_supported, bool, (struct spdk_nvme_ctrlr *ctrlr), false); -DEFINE_STUB(spdk_nvme_ctrlr_cmd_admin_raw, int, (struct spdk_nvme_ctrlr *ctrlr, - struct spdk_nvme_cmd *cmd, void *buf, uint32_t len, - spdk_nvme_cmd_cb cb_fn, void *cb_arg), 0); - DEFINE_STUB(spdk_nvme_ctrlr_cmd_abort, int, (struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair, uint16_t cid, spdk_nvme_cmd_cb cb_fn, void *cb_arg), 0); @@ -162,7 +155,7 @@ DEFINE_STUB_V(bdev_ocssd_fini_ctrlr, (struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)); DEFINE_STUB_V(bdev_ocssd_handle_chunk_notification, (struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)); struct ut_nvme_req { - enum spdk_nvme_nvm_opcode opc; + uint16_t opc; spdk_nvme_cmd_cb cb_fn; void *cb_arg; struct spdk_nvme_cpl cpl; @@ -175,10 +168,21 @@ struct spdk_nvme_ns { bool is_active; }; +struct spdk_nvme_qpair { + struct spdk_nvme_ctrlr *ctrlr; + bool is_connected; + TAILQ_HEAD(, ut_nvme_req) outstanding_reqs; + uint32_t num_outstanding_reqs; + TAILQ_ENTRY(spdk_nvme_qpair) poll_group_tailq; + struct spdk_nvme_poll_group *poll_group; + TAILQ_ENTRY(spdk_nvme_qpair) tailq; +}; + struct spdk_nvme_ctrlr { uint32_t num_ns; struct spdk_nvme_ns *ns; struct spdk_nvme_ns_data *nsdata; + struct spdk_nvme_qpair adminq; struct spdk_nvme_ctrlr_data cdata; bool is_failed; struct spdk_nvme_transport_id trid; @@ -192,16 +196,6 @@ struct spdk_nvme_poll_group { TAILQ_HEAD(, spdk_nvme_qpair) qpairs; }; -struct spdk_nvme_qpair { - struct spdk_nvme_ctrlr *ctrlr; - bool is_connected; - TAILQ_HEAD(, ut_nvme_req) outstanding_reqs; - uint32_t num_outstanding_reqs; - TAILQ_ENTRY(spdk_nvme_qpair) poll_group_tailq; - struct spdk_nvme_poll_group *poll_group; - TAILQ_ENTRY(spdk_nvme_qpair) tailq; -}; - struct spdk_nvme_probe_ctx { struct spdk_nvme_transport_id trid; void *cb_ctx; @@ -252,6 +246,9 @@ ut_attach_ctrlr(const struct spdk_nvme_transport_id *trid, uint32_t num_ns) ctrlr = calloc(1, sizeof(*ctrlr)); SPDK_CU_ASSERT_FATAL(ctrlr != NULL); + ctrlr->adminq.ctrlr = ctrlr; + TAILQ_INIT(&ctrlr->adminq.outstanding_reqs); + if (num_ns != 0) { ctrlr->num_ns = num_ns; ctrlr->ns = calloc(num_ns, sizeof(struct spdk_nvme_ns)); @@ -294,7 +291,7 @@ ut_detach_ctrlr(struct spdk_nvme_ctrlr *ctrlr) static int ut_submit_nvme_request(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, - enum spdk_nvme_nvm_opcode opc, spdk_nvme_cmd_cb cb_fn, void *cb_arg) + uint16_t opc, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { struct ut_nvme_req *req; @@ -561,6 +558,20 @@ spdk_nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr) ctrlr->is_failed = true; } +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 ut_submit_nvme_request(NULL, &ctrlr->adminq, cmd->opc, cb_fn, cb_arg); +} + +int32_t +spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr) +{ + return spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0); +} + uint32_t spdk_nvme_ns_get_id(struct spdk_nvme_ns *ns) { @@ -1579,6 +1590,30 @@ ut_test_submit_fused_nvme_cmd(struct spdk_io_channel *ch, struct spdk_bdev_io *b CU_ASSERT(nvme_ch->qpair->num_outstanding_reqs == 0); } +static void +ut_test_submit_admin_cmd(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io, + struct spdk_nvme_ctrlr *ctrlr) +{ + bdev_io->type = SPDK_BDEV_IO_TYPE_NVME_ADMIN; + bdev_io->internal.in_submit_request = true; + bdev_io->u.nvme_passthru.cmd.opc = SPDK_NVME_OPC_GET_FEATURES; + + bdev_nvme_submit_request(ch, bdev_io); + + CU_ASSERT(bdev_io->internal.in_submit_request == true); + CU_ASSERT(ctrlr->adminq.num_outstanding_reqs == 1); + + spdk_delay_us(10000); + poll_thread_times(1, 1); + + CU_ASSERT(bdev_io->internal.in_submit_request == true); + CU_ASSERT(ctrlr->adminq.num_outstanding_reqs == 0); + + poll_thread_times(0, 1); + + CU_ASSERT(bdev_io->internal.in_submit_request == false); +} + static void test_submit_nvme_cmd(void) { @@ -1594,6 +1629,8 @@ test_submit_nvme_cmd(void) ut_init_trid(&trid); + set_thread(1); + ctrlr = ut_attach_ctrlr(&trid, 1); SPDK_CU_ASSERT_FATAL(ctrlr != NULL); @@ -1614,6 +1651,8 @@ test_submit_nvme_cmd(void) bdev = nvme_bdev_ns_to_bdev(nvme_bdev_ctrlr->namespaces[0]); SPDK_CU_ASSERT_FATAL(bdev != NULL); + set_thread(0); + ch = spdk_get_io_channel(nvme_bdev_ctrlr); SPDK_CU_ASSERT_FATAL(ch != NULL); @@ -1638,12 +1677,16 @@ test_submit_nvme_cmd(void) ut_test_submit_fused_nvme_cmd(ch, bdev_io); + ut_test_submit_admin_cmd(ch, bdev_io, ctrlr); + free(bdev_io); spdk_put_io_channel(ch); poll_threads(); + set_thread(1); + rc = bdev_nvme_delete("nvme0", NULL); CU_ASSERT(rc == 0);