From c14554b681be0126523d5c7e1f0974426ba1e1b3 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Date: Fri, 24 Feb 2023 03:51:53 +0530 Subject: [PATCH] test/unit: add unit test for IO management commands Signed-off-by: Ankit Kumar Change-Id: I590a3b0a16c4300d73d00fce9302150e759b5fcd Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16947 Reviewed-by: Ben Walker Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris Tested-by: SPDK CI Jenkins --- .../lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c index c4fe0bcf4..83a2baa7b 100644 --- a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c @@ -11,6 +11,7 @@ #include "common/lib/test_env.c" #define UT_MAX_IOVS 2u +#define UT_SIZE_IOMS 128u struct nvme_ns_cmd_ut_cb_arg { struct iovec iovs[UT_MAX_IOVS]; @@ -2231,6 +2232,89 @@ test_nvme_ns_cmd_verify(void) cleanup_after_test(&qpair); } +static void +test_nvme_ns_cmd_io_mgmt_send(void) +{ + struct spdk_nvme_ns ns; + struct spdk_nvme_ctrlr ctrlr; + struct spdk_nvme_qpair qpair; + spdk_nvme_cmd_cb cb_fn = NULL; + void *cb_arg = NULL; + uint16_t list[UT_SIZE_IOMS]; + uint16_t i; + uint32_t tmp_cdw10; + int rc = 0; + + prepare_for_test(&ns, &ctrlr, &qpair, 512, 0, 128 * 1024, 0, false); + + for (i = 0; i < UT_SIZE_IOMS; i++) { + list[i] = i; + } + + /* + * Submit an I/O management send command with a list of 128 placement + * identifiers. The management operation specific field is number of + * placement identifiers which is 0 based value. + */ + rc = spdk_nvme_ns_cmd_io_mgmt_send(&ns, &qpair, list, UT_SIZE_IOMS * sizeof(uint16_t), + SPDK_NVME_FDP_IO_MGMT_SEND_RUHU, UT_SIZE_IOMS - 1, cb_fn, cb_arg); + CU_ASSERT(rc == 0); + SPDK_CU_ASSERT_FATAL(g_request != NULL); + CU_ASSERT(g_request->cmd.opc == SPDK_NVME_OPC_IO_MANAGEMENT_SEND); + CU_ASSERT(g_request->cmd.nsid == ns.id); + tmp_cdw10 = SPDK_NVME_FDP_IO_MGMT_SEND_RUHU; + tmp_cdw10 |= (UT_SIZE_IOMS - 1) << 16; + + CU_ASSERT(g_request->cmd.cdw10 == tmp_cdw10); + spdk_free(g_request->payload.contig_or_cb_arg); + nvme_free_request(g_request); + cleanup_after_test(&qpair); +} + +static void +test_nvme_ns_cmd_io_mgmt_recv(void) +{ + struct spdk_nvme_ns ns; + struct spdk_nvme_ctrlr ctrlr; + struct spdk_nvme_qpair qpair; + struct spdk_nvme_fdp_ruhs *payload;; + spdk_nvme_cmd_cb cb_fn = NULL; + void *cb_arg = NULL; + int rc = 0; + uint16_t mos = 2; + uint32_t tmp_cdw10; + uint32_t size = sizeof(struct spdk_nvme_fdp_ruhs); + + prepare_for_test(&ns, &ctrlr, &qpair, 512, 0, 128 * 1024, 0, false); + + payload = calloc(1, size); + SPDK_CU_ASSERT_FATAL(payload != NULL); + + rc = spdk_nvme_ns_cmd_io_mgmt_recv(&ns, &qpair, payload, size, + SPDK_NVME_FDP_IO_MGMT_RECV_RUHS, mos, cb_fn, cb_arg); + CU_ASSERT(rc == 0); + SPDK_CU_ASSERT_FATAL(g_request != NULL); + CU_ASSERT(g_request->cmd.opc == SPDK_NVME_OPC_IO_MANAGEMENT_RECEIVE); + CU_ASSERT(g_request->cmd.nsid == ns.id); + + tmp_cdw10 = SPDK_NVME_FDP_IO_MGMT_RECV_RUHS; + tmp_cdw10 |= (uint32_t)mos << 16; + + CU_ASSERT(g_request->cmd.cdw10 == tmp_cdw10); + /* number of dwords which is 0-based */ + CU_ASSERT(g_request->cmd.cdw11 == (size >> 2) - 1); + + spdk_free(g_request->payload.contig_or_cb_arg); + nvme_free_request(g_request); + free(payload); + + /* len not multiple of 4 */ + rc = spdk_nvme_ns_cmd_io_mgmt_recv(&ns, &qpair, NULL, 6, + SPDK_NVME_FDP_IO_MGMT_RECV_RUHS, mos, cb_fn, cb_arg); + CU_ASSERT(rc != 0); + cleanup_after_test(&qpair); +} + int main(int argc, char **argv) { @@ -2272,6 +2356,8 @@ main(int argc, char **argv) CU_ADD_TEST(suite, test_spdk_nvme_ns_cmd_writev_ext); CU_ADD_TEST(suite, test_spdk_nvme_ns_cmd_readv_ext); CU_ADD_TEST(suite, test_nvme_ns_cmd_verify); + CU_ADD_TEST(suite, test_nvme_ns_cmd_io_mgmt_send); + CU_ADD_TEST(suite, test_nvme_ns_cmd_io_mgmt_recv); g_spdk_nvme_driver = &_g_nvme_driver;