All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 27/43] hw/block/nvme: add msix_qsize parameter
Date: Wed, 17 Jun 2020 16:48:53 +0200	[thread overview]
Message-ID: <20200617144909.192176-28-kwolf@redhat.com> (raw)
In-Reply-To: <20200617144909.192176-1-kwolf@redhat.com>

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

Decouple the requested maximum number of ioqpairs (param max_ioqpairs)
from the number of MSI-X interrupt vectors by introducing a new
msix_qsize parameter and initialize MSI-X with that. This allows
emulating a device that has fewer vectors than I/O queue pairs and also
allows more than 2048 queue pairs. To keep the device behaving as
previously, use a msix_qsize default of 65 (default max_ioqpairs + 1).

This decoupling was actually suggested by Maxim some time ago in a
slightly different context, so adding a Suggested-by.

Suggested-by: Maxim Levitsky <mlevitsk@redhat.com>
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Message-Id: <20200609190333.59390-22-its@irrelevant.dk>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 hw/block/nvme.h |  1 +
 hw/block/nvme.c | 17 +++++++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/hw/block/nvme.h b/hw/block/nvme.h
index 61dd9b23b8..1d30c0bca2 100644
--- a/hw/block/nvme.h
+++ b/hw/block/nvme.h
@@ -7,6 +7,7 @@ typedef struct NvmeParams {
     char     *serial;
     uint32_t num_queues; /* deprecated since 5.1 */
     uint32_t max_ioqpairs;
+    uint16_t msix_qsize;
     uint32_t cmb_size_mb;
 } NvmeParams;
 
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index fe17aa5d70..acc6dbc900 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -54,6 +54,7 @@
 #include "trace.h"
 #include "nvme.h"
 
+#define NVME_MAX_IOQPAIRS 0xffff
 #define NVME_REG_SIZE 0x1000
 #define NVME_DB_SIZE  4
 #define NVME_CMB_BIR 2
@@ -662,7 +663,7 @@ static uint16_t nvme_create_cq(NvmeCtrl *n, NvmeCmd *cmd)
         trace_pci_nvme_err_invalid_create_cq_vector(vector);
         return NVME_INVALID_IRQ_VECTOR | NVME_DNR;
     }
-    if (unlikely(vector > n->params.max_ioqpairs)) {
+    if (unlikely(vector >= n->params.msix_qsize)) {
         trace_pci_nvme_err_invalid_create_cq_vector(vector);
         return NVME_INVALID_IRQ_VECTOR | NVME_DNR;
     }
@@ -1371,9 +1372,16 @@ static void nvme_check_constraints(NvmeCtrl *n, Error **errp)
     }
 
     if (params->max_ioqpairs < 1 ||
-        params->max_ioqpairs > PCI_MSIX_FLAGS_QSIZE) {
+        params->max_ioqpairs > NVME_MAX_IOQPAIRS) {
         error_setg(errp, "max_ioqpairs must be between 1 and %d",
-                   PCI_MSIX_FLAGS_QSIZE);
+                   NVME_MAX_IOQPAIRS);
+        return;
+    }
+
+    if (params->msix_qsize < 1 ||
+        params->msix_qsize > PCI_MSIX_FLAGS_QSIZE + 1) {
+        error_setg(errp, "msix_qsize must be between 1 and %d",
+                   PCI_MSIX_FLAGS_QSIZE + 1);
         return;
     }
 
@@ -1527,7 +1535,7 @@ static void nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev)
                           n->reg_size);
     pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
                      PCI_BASE_ADDRESS_MEM_TYPE_64, &n->iomem);
-    msix_init_exclusive_bar(pci_dev, n->params.max_ioqpairs + 1, 4, NULL);
+    msix_init_exclusive_bar(pci_dev, n->params.msix_qsize, 4, NULL);
 
     if (n->params.cmb_size_mb) {
         nvme_init_cmb(n, pci_dev);
@@ -1634,6 +1642,7 @@ static Property nvme_props[] = {
     DEFINE_PROP_UINT32("cmb_size_mb", NvmeCtrl, params.cmb_size_mb, 0),
     DEFINE_PROP_UINT32("num_queues", NvmeCtrl, params.num_queues, 0),
     DEFINE_PROP_UINT32("max_ioqpairs", NvmeCtrl, params.max_ioqpairs, 64),
+    DEFINE_PROP_UINT16("msix_qsize", NvmeCtrl, params.msix_qsize, 65),
     DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
2.25.4



  parent reply	other threads:[~2020-06-17 15:06 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-17 14:48 [PULL 00/43] Block layer patches Kevin Wolf
2020-06-17 14:48 ` [PULL 01/43] hw/ide: Make IDEDMAOps handlers take a const IDEDMA pointer Kevin Wolf
2020-06-17 14:48 ` [PULL 02/43] icount: make dma reads deterministic Kevin Wolf
2020-06-17 14:48 ` [PULL 03/43] virtio-blk: Refactor the code that processes queued requests Kevin Wolf
2020-06-17 14:48 ` [PULL 04/43] virtio-blk: On restart, process queued requests in the proper context Kevin Wolf
2020-06-17 14:48 ` [PULL 05/43] block: Refactor subdirectory recursion during make Kevin Wolf
2020-06-17 14:48 ` [PULL 06/43] qcow2: Tweak comments on qcow2_get_persistent_dirty_bitmap_size Kevin Wolf
2020-06-17 14:48 ` [PULL 07/43] hw/block/nvme: fix pci doorbell size calculation Kevin Wolf
2020-06-17 14:48 ` [PULL 08/43] hw/block/nvme: rename trace events to pci_nvme Kevin Wolf
2020-06-17 14:48 ` [PULL 09/43] hw/block/nvme: remove superfluous breaks Kevin Wolf
2020-06-17 14:48 ` [PULL 10/43] hw/block/nvme: move device parameters to separate struct Kevin Wolf
2020-06-17 14:48 ` [PULL 11/43] hw/block/nvme: use constants in identify Kevin Wolf
2020-06-17 14:48 ` [PULL 12/43] hw/block/nvme: refactor nvme_addr_read Kevin Wolf
2020-06-17 14:48 ` [PULL 13/43] hw/block/nvme: fix pin-based interrupt behavior Kevin Wolf
2020-06-17 14:48 ` [PULL 14/43] hw/block/nvme: add max_ioqpairs device parameter Kevin Wolf
2020-06-17 14:48 ` [PULL 15/43] hw/block/nvme: remove redundant cmbloc/cmbsz members Kevin Wolf
2020-06-17 14:48 ` [PULL 16/43] hw/block/nvme: factor out property/constraint checks Kevin Wolf
2020-06-17 14:48 ` [PULL 17/43] hw/block/nvme: factor out device state setup Kevin Wolf
2020-06-17 14:48 ` [PULL 18/43] hw/block/nvme: factor out block backend setup Kevin Wolf
2020-06-17 14:48 ` [PULL 19/43] hw/block/nvme: add namespace helpers Kevin Wolf
2020-06-17 14:48 ` [PULL 20/43] hw/block/nvme: factor out namespace setup Kevin Wolf
2020-06-17 14:48 ` [PULL 21/43] hw/block/nvme: factor out pci setup Kevin Wolf
2020-06-17 14:48 ` [PULL 22/43] hw/block/nvme: factor out cmb setup Kevin Wolf
2020-06-17 14:48 ` [PULL 23/43] hw/block/nvme: factor out pmr setup Kevin Wolf
2020-06-17 14:48 ` [PULL 24/43] hw/block/nvme: do cmb/pmr init as part of pci init Kevin Wolf
2020-06-17 14:48 ` [PULL 25/43] hw/block/nvme: factor out controller identify setup Kevin Wolf
2020-06-17 14:48 ` [PULL 26/43] hw/block/nvme: Verify msix_vector_use() returned value Kevin Wolf
2020-06-17 14:48 ` Kevin Wolf [this message]
2020-06-17 14:48 ` [PULL 28/43] hw/block/nvme: verify msix_init_exclusive_bar() return value Kevin Wolf
2020-06-17 14:48 ` [PULL 29/43] .gitignore: Ignore storage-daemon files Kevin Wolf
2020-06-17 14:48 ` [PULL 30/43] virtio-blk: store opt_io_size with correct size Kevin Wolf
2020-06-17 14:48 ` [PULL 31/43] block: consolidate blocksize properties consistency checks Kevin Wolf
2020-06-17 14:48 ` [PULL 32/43] qdev-properties: blocksize: use same limits in code and description Kevin Wolf
2020-06-17 14:48 ` [PULL 33/43] qdev-properties: add size32 property type Kevin Wolf
2020-06-17 14:49 ` [PULL 34/43] qdev-properties: make blocksize accept size suffixes Kevin Wolf
2020-06-17 14:49 ` [PULL 35/43] block: make BlockConf size props 32bit and " Kevin Wolf
2020-06-17 14:49 ` [PULL 36/43] qdev-properties: add getter for size32 and blocksize Kevin Wolf
2020-06-17 14:49 ` [PULL 37/43] block: lift blocksize property limit to 2 MiB Kevin Wolf
2020-06-17 14:49 ` [PULL 38/43] iotests.py: Add skip_for_formats() decorator Kevin Wolf
2020-06-17 14:49 ` [PULL 39/43] iotests/041: Skip test_small_target for qed Kevin Wolf
2020-06-17 14:49 ` [PULL 40/43] iotests/292: data_file is unsupported Kevin Wolf
2020-06-17 14:49 ` [PULL 41/43] iotests/229: " Kevin Wolf
2020-06-17 14:49 ` [PULL 42/43] iotests/{190,291}: compat=0.10 " Kevin Wolf
2020-06-17 14:49 ` [PULL 43/43] iotests: Add copyright line in qcow2.py Kevin Wolf
2020-06-17 15:48 ` [PULL 00/43] Block layer patches no-reply
2020-06-18 14:30 ` Peter Maydell
2020-06-25  8:39   ` Klaus Jensen
2020-06-25 10:39     ` Kevin Wolf

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=20200617144909.192176-28-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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.