All of lore.kernel.org
 help / color / mirror / Atom feed
From: Klaus Jensen <its@irrelevant.dk>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: Fam Zheng <fam@euphon.net>, Kevin Wolf <kwolf@redhat.com>,
	qemu-block@nongnu.org, Klaus Jensen <k.jensen@samsung.com>,
	Max Reitz <mreitz@redhat.com>, Keith Busch <kbusch@kernel.org>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Klaus Jensen <its@irrelevant.dk>
Subject: [PULL 19/38] hw/block/nvme: align zoned.zasl with mdts
Date: Mon,  8 Mar 2021 13:22:54 +0100	[thread overview]
Message-ID: <20210308122313.286938-20-its@irrelevant.dk> (raw)
In-Reply-To: <20210308122313.286938-1-its@irrelevant.dk>

From: Klaus Jensen <k.jensen@samsung.com>

ZASL (Zone Append Size Limit) is defined exactly like MDTS (Maximum Data
Transfer Size), that is, it is a value in units of the minimum memory
page size (CAP.MPSMIN) and is reported as a power of two.

The 'mdts' nvme device parameter is specified as in the spec, but the
'zoned.append_size_limit' parameter is specified in bytes. This is
suboptimal for a number of reasons:

  1. It is just plain confusing wrt. the definition of mdts.
  2. There is a lot of complexity involved in validating the value; it
     must be a power of two, it should be larger than 4k, if it is zero
     we set it internally to mdts, but still report it as zero.
  3. While "hw/block/nvme: improve invalid zasl value reporting"
     slightly improved the handling of the parameter, the validation is
     still wrong; it does not depend on CC.MPS, it depends on
     CAP.MPSMIN. And we are not even checking that it is actually less
     than or equal to MDTS, which is kinda the *one* condition it must
     satisfy.

Fix this by defining zasl exactly like mdts and checking the one thing
that it must satisfy (that it is less than or equal to mdts). Also,
change the default value from 128KiB to 0 (aka, whatever mdts is).

Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
---
 hw/block/nvme.h       |  4 +--
 hw/block/nvme.c       | 59 +++++++++++++------------------------------
 hw/block/trace-events |  2 +-
 3 files changed, 19 insertions(+), 46 deletions(-)

diff --git a/hw/block/nvme.h b/hw/block/nvme.h
index cb2b5175f1a1..f45ace0cff5b 100644
--- a/hw/block/nvme.h
+++ b/hw/block/nvme.h
@@ -20,7 +20,7 @@ typedef struct NvmeParams {
     uint32_t aer_max_queued;
     uint8_t  mdts;
     bool     use_intel_id;
-    uint32_t zasl_bs;
+    uint8_t  zasl;
     bool     legacy_cmb;
 } NvmeParams;
 
@@ -171,8 +171,6 @@ typedef struct NvmeCtrl {
     QTAILQ_HEAD(, NvmeAsyncEvent) aer_queue;
     int         aer_queued;
 
-    uint8_t     zasl;
-
     NvmeSubsystem   *subsys;
 
     NvmeNamespace   namespace;
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 25a7726ca05b..01be8a1620be 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -21,8 +21,8 @@
  *              cmb_size_mb=<cmb_size_mb[optional]>, \
  *              [pmrdev=<mem_backend_file_id>,] \
  *              max_ioqpairs=<N[optional]>, \
- *              aerl=<N[optional]>, aer_max_queued=<N[optional]>, \
- *              mdts=<N[optional]>,zoned.append_size_limit=<N[optional]>, \
+ *              aerl=<N[optional]>,aer_max_queued=<N[optional]>, \
+ *              mdts=<N[optional]>,zoned.zasl=<N[optional]>, \
  *              subsys=<subsys_id> \
  *      -device nvme-ns,drive=<drive_id>,bus=<bus_name>,nsid=<nsid>,\
  *              zoned=<true|false[optional]>, \
@@ -69,13 +69,11 @@
  *   as a power of two (2^n) and is in units of the minimum memory page size
  *   (CAP.MPSMIN). The default value is 7 (i.e. 512 KiB).
  *
- * - `zoned.append_size_limit`
- *   The maximum I/O size in bytes that is allowed in Zone Append command.
- *   The default is 128KiB. Since internally this this value is maintained as
- *   ZASL = log2(<maximum append size> / <page size>), some values assigned
- *   to this property may be rounded down and result in a lower maximum ZA
- *   data size being in effect. By setting this property to 0, users can make
- *   ZASL to be equal to MDTS. This property only affects zoned namespaces.
+ * - `zoned.zasl`
+ *   Indicates the maximum data transfer size for the Zone Append command. Like
+ *   `mdts`, the value is specified as a power of two (2^n) and is in units of
+ *   the minimum memory page size (CAP.MPSMIN). The default value is 0 (i.e.
+ *   defaulting to the value of `mdts`).
  *
  * nvme namespace device parameters
  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2135,10 +2133,9 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeRequest *req, bool append,
                 goto invalid;
             }
 
-            if (nvme_l2b(ns, nlb) > (n->page_size << n->zasl)) {
-                trace_pci_nvme_err_append_too_large(slba, nlb, n->zasl);
-                status = NVME_INVALID_FIELD;
-                goto invalid;
+            if (n->params.zasl && data_size > n->page_size << n->params.zasl) {
+                trace_pci_nvme_err_zasl(data_size);
+                return NVME_INVALID_FIELD | NVME_DNR;
             }
 
             slba = zone->w_ptr;
@@ -3212,9 +3209,8 @@ static uint16_t nvme_identify_ctrl_csi(NvmeCtrl *n, NvmeRequest *req)
     if (c->csi == NVME_CSI_NVM) {
         return nvme_rpt_empty_id_struct(n, req);
     } else if (c->csi == NVME_CSI_ZONED) {
-        if (n->params.zasl_bs) {
-            id.zasl = n->zasl;
-        }
+        id.zasl = n->params.zasl;
+
         return nvme_dma(n, (uint8_t *)&id, sizeof(id),
                         DMA_DIRECTION_FROM_DEVICE, req);
     }
@@ -4088,19 +4084,6 @@ static int nvme_start_ctrl(NvmeCtrl *n)
     nvme_init_sq(&n->admin_sq, n, n->bar.asq, 0, 0,
                  NVME_AQA_ASQS(n->bar.aqa) + 1);
 
-    if (!n->params.zasl_bs) {
-        n->zasl = n->params.mdts;
-    } else {
-        if (n->params.zasl_bs < n->page_size) {
-            NVME_GUEST_ERR(pci_nvme_err_startfail_zasl_too_small,
-                           "Zone Append Size Limit (ZASL) of %d bytes is too "
-                           "small; must be at least %d bytes",
-                           n->params.zasl_bs, n->page_size);
-            return -1;
-        }
-        n->zasl = 31 - clz32(n->params.zasl_bs / n->page_size);
-    }
-
     nvme_set_timestamp(n, 0ULL);
 
     QTAILQ_INIT(&n->aer_queue);
@@ -4609,17 +4592,10 @@ static void nvme_check_constraints(NvmeCtrl *n, Error **errp)
         host_memory_backend_set_mapped(n->pmr.dev, true);
     }
 
-    if (n->params.zasl_bs) {
-        if (!is_power_of_2(n->params.zasl_bs)) {
-            error_setg(errp, "zone append size limit has to be a power of 2");
-            return;
-        }
-
-        if (n->params.zasl_bs < 4096) {
-            error_setg(errp, "zone append size limit must be at least "
-                       "4096 bytes");
-            return;
-        }
+    if (n->params.zasl > n->params.mdts) {
+        error_setg(errp, "zoned.zasl (Zone Append Size Limit) must be less "
+                   "than or equal to mdts (Maximum Data Transfer Size)");
+        return;
     }
 }
 
@@ -4988,8 +4964,7 @@ static Property nvme_props[] = {
     DEFINE_PROP_UINT8("mdts", NvmeCtrl, params.mdts, 7),
     DEFINE_PROP_BOOL("use-intel-id", NvmeCtrl, params.use_intel_id, false),
     DEFINE_PROP_BOOL("legacy-cmb", NvmeCtrl, params.legacy_cmb, false),
-    DEFINE_PROP_SIZE32("zoned.append_size_limit", NvmeCtrl, params.zasl_bs,
-                       NVME_DEFAULT_MAX_ZA_SIZE),
+    DEFINE_PROP_UINT8("zoned.zasl", NvmeCtrl, params.zasl, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/hw/block/trace-events b/hw/block/trace-events
index e1a85661cf3f..25ba51ea5405 100644
--- a/hw/block/trace-events
+++ b/hw/block/trace-events
@@ -115,6 +115,7 @@ pci_nvme_clear_ns_reset(uint32_t state, uint64_t slba) "zone state=%"PRIu32", sl
 
 # nvme traces for error conditions
 pci_nvme_err_mdts(size_t len) "len %zu"
+pci_nvme_err_zasl(size_t len) "len %zu"
 pci_nvme_err_req_status(uint16_t cid, uint32_t nsid, uint16_t status, uint8_t opc) "cid %"PRIu16" nsid %"PRIu32" status 0x%"PRIx16" opc 0x%"PRIx8""
 pci_nvme_err_addr_read(uint64_t addr) "addr 0x%"PRIx64""
 pci_nvme_err_addr_write(uint64_t addr) "addr 0x%"PRIx64""
@@ -144,7 +145,6 @@ pci_nvme_err_zone_boundary(uint64_t slba, uint32_t nlb, uint64_t zcap) "lba 0x%"
 pci_nvme_err_zone_invalid_write(uint64_t slba, uint64_t wp) "lba 0x%"PRIx64" wp 0x%"PRIx64""
 pci_nvme_err_zone_write_not_ok(uint64_t slba, uint32_t nlb, uint16_t status) "slba=%"PRIu64", nlb=%"PRIu32", status=0x%"PRIx16""
 pci_nvme_err_zone_read_not_ok(uint64_t slba, uint32_t nlb, uint16_t status) "slba=%"PRIu64", nlb=%"PRIu32", status=0x%"PRIx16""
-pci_nvme_err_append_too_large(uint64_t slba, uint32_t nlb, uint8_t zasl) "slba=%"PRIu64", nlb=%"PRIu32", zasl=%"PRIu8""
 pci_nvme_err_insuff_active_res(uint32_t max_active) "max_active=%"PRIu32" zone limit exceeded"
 pci_nvme_err_insuff_open_res(uint32_t max_open) "max_open=%"PRIu32" zone limit exceeded"
 pci_nvme_err_zd_extension_map_error(uint32_t zone_idx) "can't map descriptor extension for zone_idx=%"PRIu32""
-- 
2.30.1



  parent reply	other threads:[~2021-03-08 12:56 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-08 12:22 [PULL 00/38] emulated nvme device updates Klaus Jensen
2021-03-08 12:22 ` [PULL 01/38] hw/block/nvme: introduce nvme-subsys device Klaus Jensen
2021-03-08 18:32   ` Paolo Bonzini
2021-03-08 18:46     ` Klaus Jensen
2021-03-08 18:53       ` Peter Maydell
2021-03-08 18:55         ` Klaus Jensen
2021-03-08 12:22 ` [PULL 02/38] hw/block/nvme: support to map controller to a subsystem Klaus Jensen
2021-03-08 12:22 ` [PULL 03/38] hw/block/nvme: add CMIC enum value for Identify Controller Klaus Jensen
2021-03-08 12:22 ` [PULL 04/38] hw/block/nvme: support for multi-controller in subsystem Klaus Jensen
2021-03-08 12:22 ` [PULL 05/38] hw/block/nvme: add NMIC enum value for Identify Namespace Klaus Jensen
2021-03-08 12:22 ` [PULL 06/38] hw/block/nvme: support for shared namespace in subsystem Klaus Jensen
2021-03-08 12:22 ` [PULL 07/38] hw/block/nvme: remove unused parameter in check zone write Klaus Jensen
2021-03-08 12:22 ` [PULL 08/38] hw/block/nvme: refactor zone resource management Klaus Jensen
2021-03-08 12:22 ` [PULL 09/38] hw/block/nvme: pull write pointer advancement to separate function Klaus Jensen
2021-03-08 12:22 ` [PULL 10/38] nvme: updated shared header for copy command Klaus Jensen
2021-03-08 12:22 ` [PULL 11/38] hw/block/nvme: add simple " Klaus Jensen
2021-03-08 12:22 ` [PULL 12/38] hw/block/nvme: fix Close Zone Klaus Jensen
2021-03-08 12:22 ` [PULL 13/38] hw/block/nvme: add missing mor/mar constraint checks Klaus Jensen
2021-03-08 12:22 ` [PULL 14/38] hw/block/nvme: improve invalid zasl value reporting Klaus Jensen
2021-03-08 12:22 ` [PULL 15/38] hw/block/nvme: use locally assigned QEMU IEEE OUI Klaus Jensen
2021-03-08 12:22 ` [PULL 16/38] hw/block/nvme: add broadcast nsid support flush command Klaus Jensen
2021-03-08 12:22 ` [PULL 17/38] hw/block/nvme: document 'mdts' nvme device parameter Klaus Jensen
2021-03-08 12:22 ` [PULL 18/38] hw/block/nvme: deduplicate bad mdts trace event Klaus Jensen
2021-03-08 12:22 ` Klaus Jensen [this message]
2021-03-08 12:22 ` [PULL 20/38] hw/block/nvme: remove unnecessary endian conversion Klaus Jensen
2021-03-08 12:22 ` [PULL 21/38] hw/block/nvme: add identify trace event Klaus Jensen
2021-03-08 12:22 ` [PULL 22/38] hw/block/nvme: fix potential compilation error Klaus Jensen
2021-03-08 12:22 ` [PULL 23/38] hw/block/nvme: add trace event for zone read check Klaus Jensen
2021-03-08 12:22 ` [PULL 24/38] hw/block/nvme: report non-mdts command size limit for dsm Klaus Jensen
2021-03-08 12:23 ` [PULL 25/38] hw/block/nvme: remove redundant len member in compare context Klaus Jensen
2021-03-08 12:23 ` [PULL 26/38] hw/block/nvme: remove block accounting for write zeroes Klaus Jensen
2021-03-08 12:23 ` [PULL 27/38] hw/block/nvme: fix strerror printing Klaus Jensen
2021-03-08 12:23 ` [PULL 28/38] hw/block/nvme: try to deal with the iov/qsg duality Klaus Jensen
2021-03-08 12:23 ` [PULL 29/38] hw/block/nvme: remove the req dependency in map functions Klaus Jensen
2021-03-08 12:23 ` [PULL 30/38] hw/block/nvme: refactor nvme_dma Klaus Jensen
2021-03-08 12:23 ` [PULL 31/38] hw/block/nvme: support namespace detach Klaus Jensen
2021-03-08 12:23 ` [PULL 32/38] hw/block/nvme: fix namespaces array to 1-based Klaus Jensen
2021-03-08 12:23 ` [PULL 33/38] hw/block/nvme: fix allocated namespace list to 256 Klaus Jensen
2021-03-08 12:23 ` [PULL 34/38] hw/block/nvme: support allocated namespace type Klaus Jensen
2021-03-08 12:23 ` [PULL 35/38] hw/block/nvme: refactor nvme_select_ns_iocs Klaus Jensen
2021-03-08 12:23 ` [PULL 36/38] hw/block/nvme: support namespace attachment command Klaus Jensen
2021-03-08 12:23 ` [PULL 37/38] hw/block/nvme: support changed namespace asynchronous event Klaus Jensen
2021-03-08 12:23 ` [PULL 38/38] hw/block/nvme: support Identify NS Attached Controller List Klaus Jensen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210308122313.286938-20-its@irrelevant.dk \
    --to=its@irrelevant.dk \
    --cc=fam@euphon.net \
    --cc=k.jensen@samsung.com \
    --cc=kbusch@kernel.org \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.