From 9937ba0b5fed1e8462c93079b81e8e020ec43ffa Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 17 Mar 2021 10:18:36 +0900 Subject: [PATCH] bdev/nvme: Fix the RPC bdev_nvme_send_cmd to pass the registered io_device, nvme_bdev_ctrlr, correctly to get io_channel Previously, not nvme_bdev_ctrlr but spdk_nvme_ctrlr pointer had been passed to spdk_get_io_channel() in nvme_rpc_io_cmd_bdev_nvme(). There was no unit test for bdev_nvme_get_io_qpair(), and so add unit test for it to guard us from degradation. Signed-off-by: Shuhei Matsumoto Change-Id: I00fdc14ea6467162c5fb90d04389883d7c409a17 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6920 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Aleksey Marchuk --- module/bdev/nvme/bdev_nvme.c | 4 +- module/bdev/nvme/nvme_rpc.c | 2 +- .../lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c | 39 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 2e9233453..daad167e9 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -209,7 +209,9 @@ bdev_nvme_get_io_qpair(struct spdk_io_channel *ctrlr_io_ch) { struct nvme_io_channel *nvme_ch; - nvme_ch = spdk_io_channel_get_ctx(ctrlr_io_ch); + assert(ctrlr_io_ch != NULL); + + nvme_ch = spdk_io_channel_get_ctx(ctrlr_io_ch); return nvme_ch->qpair; } diff --git a/module/bdev/nvme/nvme_rpc.c b/module/bdev/nvme/nvme_rpc.c index 8f2e62b7e..f212e9e70 100644 --- a/module/bdev/nvme/nvme_rpc.c +++ b/module/bdev/nvme/nvme_rpc.c @@ -190,7 +190,7 @@ nvme_rpc_io_cmd_bdev_nvme(struct rpc_bdev_nvme_send_cmd_ctx *ctx, struct spdk_nv struct spdk_nvme_qpair *io_qpair; int ret; - ctx->ctrlr_io_ch = spdk_get_io_channel(_nvme_ctrlr->ctrlr); + ctx->ctrlr_io_ch = spdk_get_io_channel(_nvme_ctrlr); io_qpair = bdev_nvme_get_io_qpair(ctx->ctrlr_io_ch); ret = spdk_nvme_ctrlr_cmd_io_raw_with_md(_nvme_ctrlr->ctrlr, io_qpair, 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 749cbd0e5..8000fce87 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 @@ -1989,6 +1989,44 @@ test_abort(void) ut_detach_ctrlr(ctrlr); } +static void +test_get_io_qpair(void) +{ + struct spdk_nvme_transport_id trid = {}; + struct spdk_nvme_ctrlr ctrlr = {}; + struct nvme_bdev_ctrlr *nvme_bdev_ctrlr = NULL; + struct spdk_io_channel *ch; + struct nvme_io_channel *nvme_ch; + struct spdk_nvme_qpair *qpair; + int rc; + + ut_init_trid(&trid); + TAILQ_INIT(&ctrlr.active_io_qpairs); + + set_thread(0); + + rc = nvme_bdev_ctrlr_create(&ctrlr, "nvme0", &trid, 0, &nvme_bdev_ctrlr); + CU_ASSERT(rc == 0); + SPDK_CU_ASSERT_FATAL(nvme_bdev_ctrlr != NULL); + + ch = spdk_get_io_channel(nvme_bdev_ctrlr); + SPDK_CU_ASSERT_FATAL(ch != NULL); + nvme_ch = spdk_io_channel_get_ctx(ch); + CU_ASSERT(nvme_ch->qpair != NULL); + + qpair = bdev_nvme_get_io_qpair(ch); + CU_ASSERT(qpair == nvme_ch->qpair); + + spdk_put_io_channel(ch); + + rc = bdev_nvme_delete("nvme0", NULL); + CU_ASSERT(rc == 0); + + poll_threads(); + + CU_ASSERT(nvme_bdev_ctrlr_get_by_name("nvme0") == NULL); +} + int main(int argc, const char **argv) { @@ -2011,6 +2049,7 @@ main(int argc, const char **argv) CU_ADD_TEST(suite, test_submit_nvme_cmd); CU_ADD_TEST(suite, test_remove_trid); CU_ADD_TEST(suite, test_abort); + CU_ADD_TEST(suite, test_get_io_qpair); CU_basic_set_mode(CU_BRM_VERBOSE);