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 <niklas.cassel@wdc.com>
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 <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Niklas Cassel 2020-11-17 15:44:04 +00:00 committed by Tomasz Zawadzki
parent 38d59d8b5a
commit 23a1916935
6 changed files with 28 additions and 1 deletions

View File

@ -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); 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. * Submit a Close Zone operation to the specified NVMe namespace.
* *

View File

@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
SO_VER := 4 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 \ 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 nvme_ns_ocssd_cmd.c nvme_tcp.c nvme_opal.c nvme_io_msg.c nvme_poll_group.c nvme_zns.c

View File

@ -1667,6 +1667,14 @@ nvme_ctrlr_identify_zns_specific_done(void *arg, const struct spdk_nvme_cpl *cpl
return; 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, nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_GET_ZNS_CMD_EFFECTS_LOG,
ctrlr->opts.admin_timeout_ms); ctrlr->opts.admin_timeout_ms);
} }

View File

@ -848,6 +848,9 @@ struct spdk_nvme_ctrlr {
/* scratchpad pointer that can be used to send data between two NVME_CTRLR_STATEs */ /* scratchpad pointer that can be used to send data between two NVME_CTRLR_STATEs */
void *tmp_ptr; void *tmp_ptr;
/* maximum zone append size in bytes */
uint32_t max_zone_append_size;
}; };
struct spdk_nvme_probe_ctx { struct spdk_nvme_probe_ctx {

View File

@ -60,6 +60,12 @@ spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr)
return ctrlr->cdata_zns; 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 static int
nvme_zns_zone_mgmt_recv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, nvme_zns_zone_mgmt_recv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
void *payload, uint32_t payload_size, uint64_t slba, void *payload, uint32_t payload_size, uint64_t slba,

View File

@ -163,6 +163,7 @@
spdk_nvme_zns_ns_get_zone_size; spdk_nvme_zns_ns_get_zone_size;
spdk_nvme_zns_ns_get_num_zones; spdk_nvme_zns_ns_get_num_zones;
spdk_nvme_zns_ctrlr_get_data; spdk_nvme_zns_ctrlr_get_data;
spdk_nvme_zns_ctrlr_get_max_zone_append_size;
spdk_nvme_zns_close_zone; spdk_nvme_zns_close_zone;
spdk_nvme_zns_finish_zone; spdk_nvme_zns_finish_zone;
spdk_nvme_zns_open_zone; spdk_nvme_zns_open_zone;