From 490c83c6ac296b9d507f4124cd1f296354ed501b Mon Sep 17 00:00:00 2001 From: Krishna Kanth Reddy Date: Tue, 14 Sep 2021 14:31:28 +0530 Subject: [PATCH] lib/nvme: NVMe ZNS - Zone Descriptor Extension support Signed-off-by: Krishna Kanth Reddy Change-Id: I11a72f48bf4e39e0547c29cb0213679ab24388b2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9494 Reviewed-by: Klaus Jensen Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot --- CHANGELOG.md | 3 +++ include/spdk/nvme_zns.h | 39 +++++++++++++++++++++++++++++++++++++ lib/nvme/nvme_zns.c | 43 +++++++++++++++++++++++++++++++++++++++++ lib/nvme/spdk_nvme.map | 2 ++ 4 files changed, 87 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fe156840..4b5636aff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,9 @@ log level. ### nvme +Added new functions `spdk_nvme_zns_set_zone_desc_ext` and `spdk_nvme_zns_ext_report_zones` +to set zone descriptor extension and to get extended zone report respectively. + New API `spdk_nvme_ctrlr_get_memory_domain` has been added, it allows to get SPDK memory domain used by nvme controller. New API functions `spdk_nvme_ns_cmd_readv_ext` and `spdk_nvme_ns_cmd_writev_ext` diff --git a/include/spdk/nvme_zns.h b/include/spdk/nvme_zns.h index 025f5b091..9ba3bbd94 100644 --- a/include/spdk/nvme_zns.h +++ b/include/spdk/nvme_zns.h @@ -359,6 +359,23 @@ int spdk_nvme_zns_offline_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair * uint64_t slba, bool select_all, spdk_nvme_cmd_cb cb_fn, void *cb_arg); +/** + * Submit a Set Zone Descriptor Extension operation to the specified NVMe namespace. + * + * \param ns Namespace. + * \param qpair I/O queue pair to submit the request. + * \param slba starting LBA of the zone to operate on. + * \param buffer Virtual address pointer to the data payload buffer. + * \param payload_size Payload buffer size. + * \param cb_fn Callback function invoked when the I/O command completes. + * \param cb_arg Argument passed to callback function. + * + * \return 0 on success. Negated errno on failure. + */ +int spdk_nvme_zns_set_zone_desc_ext(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, + uint64_t slba, void *buffer, uint32_t payload_size, + spdk_nvme_cmd_cb cb_fn, void *cb_arg); + /** * Get a zone report from the specified NVMe namespace. * @@ -381,6 +398,28 @@ int spdk_nvme_zns_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair * enum spdk_nvme_zns_zra_report_opts report_opts, bool partial_report, spdk_nvme_cmd_cb cb_fn, void *cb_arg); +/** + * Get a extended zone report from the specified NVMe namespace. + * + * \param ns Namespace. + * \param qpair I/O queue pair to submit the request. + * \param payload The pointer to the payload buffer. + * \param payload_size The size of payload buffer. + * \param slba starting LBA of the zone to operate on. + * \param report_opts Filter on which zone states to include in the extended zone report. + * \param partial_report If true, nr_zones field in the extended zone report indicates the number of zone + * descriptors that were successfully written to the extended zone report. If false, nr_zones field in the + * extended zone report indicates the number of zone descriptors that match the report_opts criteria. + * \param cb_fn Callback function invoked when the I/O command completes. + * \param cb_arg Argument passed to callback function. + * + * \return 0 on success. Negated errno on failure. + */ +int spdk_nvme_zns_ext_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, + void *payload, uint32_t payload_size, uint64_t slba, + enum spdk_nvme_zns_zra_report_opts report_opts, bool partial_report, + spdk_nvme_cmd_cb cb_fn, void *cb_arg); + #ifdef __cplusplus } #endif diff --git a/lib/nvme/nvme_zns.c b/lib/nvme/nvme_zns.c index 949887387..80abd9578 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -170,6 +170,17 @@ spdk_nvme_zns_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpai cb_fn, cb_arg); } +int +spdk_nvme_zns_ext_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, + void *payload, uint32_t payload_size, uint64_t slba, + enum spdk_nvme_zns_zra_report_opts report_opts, bool partial_report, + spdk_nvme_cmd_cb cb_fn, void *cb_arg) +{ + return nvme_zns_zone_mgmt_recv(ns, qpair, payload, payload_size, slba, + SPDK_NVME_ZONE_EXTENDED_REPORT, report_opts, partial_report, + cb_fn, cb_arg); +} + static int nvme_zns_zone_mgmt_send(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, uint64_t slba, bool select_all, uint8_t zone_send_action, @@ -235,3 +246,35 @@ spdk_nvme_zns_offline_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpai return nvme_zns_zone_mgmt_send(ns, qpair, slba, select_all, SPDK_NVME_ZONE_OFFLINE, cb_fn, cb_arg); } + +int +spdk_nvme_zns_set_zone_desc_ext(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, + uint64_t slba, void *buffer, uint32_t payload_size, + spdk_nvme_cmd_cb cb_fn, void *cb_arg) +{ + struct nvme_request *req; + struct spdk_nvme_cmd *cmd; + + if (payload_size == 0) { + return -EINVAL; + } + + if (buffer == NULL) { + return -EINVAL; + } + + req = nvme_allocate_request_user_copy(qpair, buffer, payload_size, cb_fn, cb_arg, true); + if (req == NULL) { + return -ENOMEM; + } + + cmd = &req->cmd; + cmd->opc = SPDK_NVME_OPC_ZONE_MGMT_SEND; + cmd->nsid = ns->id; + + *(uint64_t *)&cmd->cdw10 = slba; + + cmd->cdw13 = SPDK_NVME_ZONE_SET_ZDE; + + return nvme_qpair_submit_request(qpair, req); +} diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index 048879ce7..f31b3acbb 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -207,7 +207,9 @@ spdk_nvme_zns_open_zone; spdk_nvme_zns_reset_zone; spdk_nvme_zns_offline_zone; + spdk_nvme_zns_set_zone_desc_ext; spdk_nvme_zns_report_zones; + spdk_nvme_zns_ext_report_zones; # public functions from nvme_ocssd.h spdk_nvme_ctrlr_is_ocssd_supported;