From 23a1916935fd98fa031aa314a154ece648163a84 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Tue, 17 Nov 2020 15:44:04 +0000 Subject: [PATCH] nvme: add function to get the max zone append data transfer size The zone append command, which is part of the Zoned Namespace Command Set, has a maximum data transfer size that can be less than or equal to mdts. Since zone append commands will not be allowed to be split, the user has to be able to get the maximum zone append data transfer size. Add a function that returns this limit. Signed-off-by: Niklas Cassel Change-Id: I9da2672ea8a307ff62251c069a42f7540765e08b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5140 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Paul Luse Reviewed-by: Aleksey Marchuk --- include/spdk/nvme_zns.h | 9 +++++++++ lib/nvme/Makefile | 2 +- lib/nvme/nvme_ctrlr.c | 8 ++++++++ lib/nvme/nvme_internal.h | 3 +++ lib/nvme/nvme_zns.c | 6 ++++++ lib/nvme/spdk_nvme.map | 1 + 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/spdk/nvme_zns.h b/include/spdk/nvme_zns.h index 9ee02fa33..8624f1f7d 100644 --- a/include/spdk/nvme_zns.h +++ b/include/spdk/nvme_zns.h @@ -98,6 +98,15 @@ uint64_t spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns); */ const struct spdk_nvme_zns_ctrlr_data *spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr); +/** + * Get the maximum zone append data transfer size of a given NVMe controller. + * + * \param ctrlr Opaque handle to NVMe controller. + * + * \return Maximum zone append data transfer size of the NVMe controller in bytes. + */ +uint32_t spdk_nvme_zns_ctrlr_get_max_zone_append_size(const struct spdk_nvme_ctrlr *ctrlr); + /** * Submit a Close Zone operation to the specified NVMe namespace. * diff --git a/lib/nvme/Makefile b/lib/nvme/Makefile index a468d4078..776de0b0d 100644 --- a/lib/nvme/Makefile +++ b/lib/nvme/Makefile @@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk SO_VER := 4 -SO_MINOR := 1 +SO_MINOR := 2 C_SRCS = nvme_ctrlr_cmd.c nvme_ctrlr.c nvme_fabric.c nvme_ns_cmd.c nvme_ns.c nvme_pcie.c nvme_qpair.c nvme.c nvme_quirks.c nvme_transport.c nvme_uevent.c nvme_ctrlr_ocssd_cmd.c \ nvme_ns_ocssd_cmd.c nvme_tcp.c nvme_opal.c nvme_io_msg.c nvme_poll_group.c nvme_zns.c diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 7deeec193..fb78fca71 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1667,6 +1667,14 @@ nvme_ctrlr_identify_zns_specific_done(void *arg, const struct spdk_nvme_cpl *cpl return; } + /* A zero zasl value means use mdts */ + if (ctrlr->cdata_zns->zasl) { + uint32_t max_append = ctrlr->min_page_size * (1 << ctrlr->cdata_zns->zasl); + ctrlr->max_zone_append_size = spdk_min(ctrlr->max_xfer_size, max_append); + } else { + ctrlr->max_zone_append_size = ctrlr->max_xfer_size; + } + nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_GET_ZNS_CMD_EFFECTS_LOG, ctrlr->opts.admin_timeout_ms); } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index eca1c05fb..c57bf85e8 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -848,6 +848,9 @@ struct spdk_nvme_ctrlr { /* scratchpad pointer that can be used to send data between two NVME_CTRLR_STATEs */ void *tmp_ptr; + + /* maximum zone append size in bytes */ + uint32_t max_zone_append_size; }; struct spdk_nvme_probe_ctx { diff --git a/lib/nvme/nvme_zns.c b/lib/nvme/nvme_zns.c index 11818b9fd..ec68aa0f8 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -60,6 +60,12 @@ spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr) return ctrlr->cdata_zns; } +uint32_t +spdk_nvme_zns_ctrlr_get_max_zone_append_size(const struct spdk_nvme_ctrlr *ctrlr) +{ + return ctrlr->max_zone_append_size; +} + static int nvme_zns_zone_mgmt_recv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, void *payload, uint32_t payload_size, uint64_t slba, diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index d8b535bd7..de041cc2a 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -163,6 +163,7 @@ spdk_nvme_zns_ns_get_zone_size; spdk_nvme_zns_ns_get_num_zones; spdk_nvme_zns_ctrlr_get_data; + spdk_nvme_zns_ctrlr_get_max_zone_append_size; spdk_nvme_zns_close_zone; spdk_nvme_zns_finish_zone; spdk_nvme_zns_open_zone;