From 1572882a7f38480b18dd69b2c88ad0d2d9a404c1 Mon Sep 17 00:00:00 2001 From: sunshihao520 Date: Fri, 15 Jan 2021 15:45:39 +0800 Subject: [PATCH] lib/nvme: add function spdk_nvme_bytes_to_numd to calculate number of dwords According to kernel, use an inline function spdk_nvme_bytes_to_numd to transfer paload_size form bytes to numer of dwords. Signed-off-by: sunshihao Change-Id: I8b9ded122bbf4a3c8e46988993ea52404783c0b0 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5926 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- CHANGELOG.md | 3 ++- include/spdk/nvme_spec.h | 6 ++++++ lib/nvme/nvme_ctrlr_cmd.c | 4 ++-- lib/nvme/nvme_zns.c | 2 +- module/bdev/nvme/bdev_nvme_rpc.c | 4 ++-- test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c | 2 +- test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c | 8 ++++---- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89142fb5a..67422969c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,8 @@ parameter in `spdk_blob_open_opts_init` function. Added a new function `spdk_nvme_ctrlr_reset_subsystem` to perform a NVMe subsystem reset. Note: The NVMf target does not support the subsystem reset yet. - +Add a new function 'spdk_nvme_bytes_to_numd' to transfer bytes to number of +dwords. ### event The pci_whitelist and pci_blacklist members of struct spdk_app_opts have been diff --git a/include/spdk/nvme_spec.h b/include/spdk/nvme_spec.h index c48b30170..f86ac4ea7 100644 --- a/include/spdk/nvme_spec.h +++ b/include/spdk/nvme_spec.h @@ -1398,6 +1398,12 @@ static inline enum spdk_nvme_data_transfer spdk_nvme_opc_get_data_transfer(uint8 return (enum spdk_nvme_data_transfer)(opc & 3); } +static inline uint32_t +spdk_nvme_bytes_to_numd(uint32_t len) +{ + return (len >> 2) - 1; +} + enum spdk_nvme_feat { /* 0x00 - reserved */ diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index dffc13ac3..9412de099 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -516,7 +516,7 @@ spdk_nvme_ctrlr_cmd_get_log_page_ext(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_ return -EINVAL; } - numd = payload_size / sizeof(uint32_t) - 1u; + numd = spdk_nvme_bytes_to_numd(payload_size); numdl = numd & 0xFFFFu; numdu = (numd >> 16) & 0xFFFFu; @@ -867,7 +867,7 @@ nvme_ctrlr_cmd_fw_image_download(struct spdk_nvme_ctrlr *ctrlr, cmd = &req->cmd; cmd->opc = SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD; - cmd->cdw10 = (size >> 2) - 1; + cmd->cdw10 = spdk_nvme_bytes_to_numd(size); cmd->cdw11 = offset >> 2; rc = nvme_ctrlr_submit_admin_request(ctrlr, req); diff --git a/lib/nvme/nvme_zns.c b/lib/nvme/nvme_zns.c index ec68aa0f8..bdfffa344 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -85,7 +85,7 @@ nvme_zns_zone_mgmt_recv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, cmd->nsid = ns->id; *(uint64_t *)&cmd->cdw10 = slba; - cmd->cdw12 = payload_size / sizeof(uint32_t) - 1u; + cmd->cdw12 = spdk_nvme_bytes_to_numd(payload_size); cmd->cdw13 = zone_recv_action | zra_spec_field << 8 | zra_spec_feats << 16; return nvme_qpair_submit_request(qpair, req); diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 2cb55451b..16b9f4161 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -753,7 +753,7 @@ apply_firmware_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg firm_ctx->transfer = spdk_min(firm_ctx->size_remaining, 4096); cmd.opc = SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD; - cmd.cdw10 = (firm_ctx->transfer >> 2) - 1; + cmd.cdw10 = spdk_nvme_bytes_to_numd(firm_ctx->transfer); cmd.cdw11 = firm_ctx->offset >> 2; rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, &cmd, firm_ctx->p, firm_ctx->transfer, apply_firmware_complete, firm_ctx); @@ -913,7 +913,7 @@ rpc_bdev_nvme_apply_firmware(struct spdk_jsonrpc_request *request, memset(cmd, 0, sizeof(struct spdk_nvme_cmd)); cmd->opc = SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD; - cmd->cdw10 = (firm_ctx->transfer >> 2) - 1; + cmd->cdw10 = spdk_nvme_bytes_to_numd(firm_ctx->transfer); cmd->cdw11 = firm_ctx->offset >> 2; rc = spdk_bdev_nvme_admin_passthru(firm_ctx->desc, firm_ctx->ch, cmd, firm_ctx->p, diff --git a/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c b/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c index 7d913fee0..d613d703d 100644 --- a/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c @@ -313,7 +313,7 @@ static void verify_fw_commit(struct nvme_request *req) static void verify_fw_image_download(struct nvme_request *req) { CU_ASSERT(req->cmd.opc == SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD); - CU_ASSERT(req->cmd.cdw10 == (fw_img_size >> 2) - 1); + CU_ASSERT(req->cmd.cdw10 == spdk_nvme_bytes_to_numd(fw_img_size)); CU_ASSERT(req->cmd.cdw11 == fw_img_offset >> 2); } diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 5224495b0..280ec1dbb 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -277,7 +277,7 @@ test_get_log_page(void) memset(&rsp, 0, sizeof(rsp)); cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; cmd.nvme_cmd.cdw10_bits.get_log_page.lid = SPDK_NVME_LOG_ERROR; - cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = (req.length / 4 - 1); + cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = spdk_nvme_bytes_to_numd(req.length); CU_ASSERT(nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); @@ -296,7 +296,7 @@ test_get_log_page(void) memset(&rsp, 0, sizeof(rsp)); cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; cmd.nvme_cmd.cdw10_bits.get_log_page.lid = SPDK_NVME_LOG_ERROR; - cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = (req.length / 4 - 1); + cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = spdk_nvme_bytes_to_numd(req.length); cmd.nvme_cmd.cdw12 = 2; CU_ASSERT(nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); @@ -308,7 +308,7 @@ test_get_log_page(void) req.data = NULL; cmd.nvme_cmd.opc = SPDK_NVME_OPC_GET_LOG_PAGE; cmd.nvme_cmd.cdw10_bits.get_log_page.lid = SPDK_NVME_LOG_ERROR; - cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = (req.length / 4 - 1); + cmd.nvme_cmd.cdw10_bits.get_log_page.numdl = spdk_nvme_bytes_to_numd(req.length); CU_ASSERT(nvmf_ctrlr_get_log_page(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT(req.rsp->nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); CU_ASSERT(req.rsp->nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_FIELD); @@ -1946,7 +1946,7 @@ test_rae(void) cmd[i].nvme_cmd.cdw10_bits.get_log_page.lid = SPDK_NVME_LOG_CHANGED_NS_LIST; cmd[i].nvme_cmd.cdw10_bits.get_log_page.numdl = - (req[i].length / 4 - 1); + spdk_nvme_bytes_to_numd(req[i].length); cmd[i].nvme_cmd.cid = i; } cmd[1].nvme_cmd.cdw10_bits.get_log_page.rae = 1;