All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Klaus Jensen <its@irrelevant.dk>, qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Beata Michalska <beata.michalska@linaro.org>,
	Klaus Jensen <k.jensen@samsung.com>,
	qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
	Keith Busch <kbusch@kernel.org>,
	Javier Gonzalez <javier.gonz@samsung.com>,
	Maxim Levitsky <mlevitsk@redhat.com>
Subject: Re: [PATCH 07/16] nvme: add max_ioqpairs device parameter
Date: Wed, 15 Apr 2020 13:02:45 +0200	[thread overview]
Message-ID: <7a7e84ad-0f1d-2b56-6001-daa3403ec674@redhat.com> (raw)
In-Reply-To: <20200415102445.564803-8-its@irrelevant.dk>

On 4/15/20 12:24 PM, Klaus Jensen wrote:
> From: Klaus Jensen <k.jensen@samsung.com>
> 
> The num_queues device paramater has a slightly confusing meaning because
> it accounts for the admin queue pair which is not really optional.
> Secondly, it is really a maximum value of queues allowed.
> 
> Add a new max_ioqpairs parameter that only accounts for I/O queue pairs,
> but keep num_queues for compatibility.
> 
> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
> Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
> ---
>   hw/block/nvme.c | 46 ++++++++++++++++++++++++++++------------------
>   hw/block/nvme.h |  4 +++-
>   2 files changed, 31 insertions(+), 19 deletions(-)
> 
> diff --git a/hw/block/nvme.c b/hw/block/nvme.c
> index 287e1e49c0bf..9383d2cb0b38 100644
> --- a/hw/block/nvme.c
> +++ b/hw/block/nvme.c
> @@ -19,7 +19,7 @@
>    *      -drive file=<file>,if=none,id=<drive_id>
>    *      -device nvme,drive=<drive_id>,serial=<serial>,id=<id[optional]>, \
>    *              cmb_size_mb=<cmb_size_mb[optional]>, \
> - *              num_queues=<N[optional]>
> + *              max_ioqpairs=<N[optional]>
>    *
>    * Note cmb_size_mb denotes size of CMB in MB. CMB is assumed to be at
>    * offset 0 in BAR2 and supports only WDS, RDS and SQS for now.
> @@ -27,6 +27,7 @@
>   
>   #include "qemu/osdep.h"
>   #include "qemu/units.h"
> +#include "qemu/error-report.h"
>   #include "hw/block/block.h"
>   #include "hw/pci/msix.h"
>   #include "hw/pci/pci.h"
> @@ -72,12 +73,12 @@ static void nvme_addr_read(NvmeCtrl *n, hwaddr addr, void *buf, int size)
>   
>   static int nvme_check_sqid(NvmeCtrl *n, uint16_t sqid)
>   {
> -    return sqid < n->params.num_queues && n->sq[sqid] != NULL ? 0 : -1;
> +    return sqid < n->params.max_ioqpairs + 1 && n->sq[sqid] != NULL ? 0 : -1;
>   }
>   
>   static int nvme_check_cqid(NvmeCtrl *n, uint16_t cqid)
>   {
> -    return cqid < n->params.num_queues && n->cq[cqid] != NULL ? 0 : -1;
> +    return cqid < n->params.max_ioqpairs + 1 && n->cq[cqid] != NULL ? 0 : -1;
>   }
>   
>   static void nvme_inc_cq_tail(NvmeCQueue *cq)
> @@ -639,7 +640,7 @@ static uint16_t nvme_create_cq(NvmeCtrl *n, NvmeCmd *cmd)
>           trace_nvme_dev_err_invalid_create_cq_addr(prp1);
>           return NVME_INVALID_FIELD | NVME_DNR;
>       }
> -    if (unlikely(vector > n->params.num_queues)) {
> +    if (unlikely(vector > n->params.max_ioqpairs + 1)) {
>           trace_nvme_dev_err_invalid_create_cq_vector(vector);
>           return NVME_INVALID_IRQ_VECTOR | NVME_DNR;
>       }
> @@ -791,8 +792,8 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req)
>           trace_nvme_dev_getfeat_vwcache(result ? "enabled" : "disabled");
>           break;
>       case NVME_NUMBER_OF_QUEUES:
> -        result = cpu_to_le32((n->params.num_queues - 2) |
> -                             ((n->params.num_queues - 2) << 16));
> +        result = cpu_to_le32((n->params.max_ioqpairs - 1) |
> +                             ((n->params.max_ioqpairs - 1) << 16));
>           trace_nvme_dev_getfeat_numq(result);
>           break;
>       case NVME_TIMESTAMP:
> @@ -836,10 +837,10 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeCmd *cmd, NvmeRequest *req)
>       case NVME_NUMBER_OF_QUEUES:
>           trace_nvme_dev_setfeat_numq((dw11 & 0xFFFF) + 1,
>                                       ((dw11 >> 16) & 0xFFFF) + 1,
> -                                    n->params.num_queues - 1,
> -                                    n->params.num_queues - 1);
> -        req->cqe.result = cpu_to_le32((n->params.num_queues - 2) |
> -                                      ((n->params.num_queues - 2) << 16));
> +                                    n->params.max_ioqpairs,
> +                                    n->params.max_ioqpairs);
> +        req->cqe.result = cpu_to_le32((n->params.max_ioqpairs - 1) |
> +                                      ((n->params.max_ioqpairs - 1) << 16));
>           break;
>       case NVME_TIMESTAMP:
>           return nvme_set_feature_timestamp(n, cmd);
> @@ -910,12 +911,12 @@ static void nvme_clear_ctrl(NvmeCtrl *n)
>   
>       blk_drain(n->conf.blk);
>   
> -    for (i = 0; i < n->params.num_queues; i++) {
> +    for (i = 0; i < n->params.max_ioqpairs + 1; i++) {
>           if (n->sq[i] != NULL) {
>               nvme_free_sq(n->sq[i], n);
>           }
>       }
> -    for (i = 0; i < n->params.num_queues; i++) {
> +    for (i = 0; i < n->params.max_ioqpairs + 1; i++) {
>           if (n->cq[i] != NULL) {
>               nvme_free_cq(n->cq[i], n);
>           }
> @@ -1316,8 +1317,17 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
>       int64_t bs_size;
>       uint8_t *pci_conf;
>   
> -    if (!n->params.num_queues) {
> -        error_setg(errp, "num_queues can't be zero");
> +    if (n->params.num_queues) {
> +        warn_report("num_queues is deprecated; please use max_ioqpairs "
> +                    "instead");
> +
> +        n->params.max_ioqpairs = n->params.num_queues - 1;
> +    }
> +
> +    if (n->params.max_ioqpairs < 1 ||
> +        n->params.max_ioqpairs > PCI_MSIX_FLAGS_QSIZE) {
> +        error_setg(errp, "max_ioqpairs must be between 1 and %d",
> +                   PCI_MSIX_FLAGS_QSIZE);
>           return;
>       }
>   
> @@ -1349,19 +1359,19 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
>       pcie_endpoint_cap_init(pci_dev, 0x80);
>   
>       n->num_namespaces = 1;
> -    n->reg_size = pow2ceil(0x1000 + 2 * n->params.num_queues * 4);
> +    n->reg_size = pow2ceil(0x1008 + 2 * (n->params.max_ioqpairs) * 4);
>       n->ns_size = bs_size / (uint64_t)n->num_namespaces;
>   
>       n->namespaces = g_new0(NvmeNamespace, n->num_namespaces);
> -    n->sq = g_new0(NvmeSQueue *, n->params.num_queues);
> -    n->cq = g_new0(NvmeCQueue *, n->params.num_queues);
> +    n->sq = g_new0(NvmeSQueue *, n->params.max_ioqpairs + 1);
> +    n->cq = g_new0(NvmeCQueue *, n->params.max_ioqpairs + 1);
>   
>       memory_region_init_io(&n->iomem, OBJECT(n), &nvme_mmio_ops, n,
>                             "nvme", 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.num_queues, 4, NULL);
> +    msix_init_exclusive_bar(pci_dev, n->params.max_ioqpairs + 1, 4, NULL);
>   
>       id->vid = cpu_to_le16(pci_get_word(pci_conf + PCI_VENDOR_ID));
>       id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID));
> diff --git a/hw/block/nvme.h b/hw/block/nvme.h
> index 9957c4a200e2..98f5b9479244 100644
> --- a/hw/block/nvme.h
> +++ b/hw/block/nvme.h
> @@ -6,11 +6,13 @@
>   #define DEFINE_NVME_PROPERTIES(_state, _props) \
>       DEFINE_PROP_STRING("serial", _state, _props.serial), \
>       DEFINE_PROP_UINT32("cmb_size_mb", _state, _props.cmb_size_mb, 0), \
> -    DEFINE_PROP_UINT32("num_queues", _state, _props.num_queues, 64)
> +    DEFINE_PROP_UINT32("num_queues", _state, _props.num_queues, 0), \
> +    DEFINE_PROP_UINT32("max_ioqpairs", _state, _props.max_ioqpairs, 64)
>   
>   typedef struct NvmeParams {
>       char     *serial;
>       uint32_t num_queues;

I'm tempted to rename it 'deprecated_num_queues' ... Can you add a 
comment such /* deprecated since 5.0 */?

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +    uint32_t max_ioqpairs;
>       uint32_t cmb_size_mb;
>   } NvmeParams;
>   
> 



  reply	other threads:[~2020-04-15 11:04 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-15 10:24 [PATCH 00/16] nvme: refactoring and cleanups Klaus Jensen
2020-04-15 10:24 ` [PATCH 01/16] nvme: fix pci doorbell size calculation Klaus Jensen
2020-04-15 11:34   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 02/16] nvme: rename trace events to nvme_dev Klaus Jensen
2020-04-15 11:36   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 03/16] nvme: remove superfluous breaks Klaus Jensen
2020-04-15 10:24 ` [PATCH 04/16] nvme: move device parameters to separate struct Klaus Jensen
2020-04-15 10:24 ` [PATCH 05/16] nvme: use constants in identify Klaus Jensen
2020-04-15 10:24 ` [PATCH 06/16] nvme: refactor nvme_addr_read Klaus Jensen
2020-04-15 10:24 ` [PATCH 07/16] nvme: add max_ioqpairs device parameter Klaus Jensen
2020-04-15 11:02   ` Philippe Mathieu-Daudé [this message]
2020-04-15 10:24 ` [PATCH 08/16] nvme: remove redundant cmbloc/cmbsz members Klaus Jensen
2020-04-15 10:24 ` [PATCH 09/16] nvme: factor out property/constraint checks Klaus Jensen
2020-04-15 10:56   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 10/16] nvme: factor out device state setup Klaus Jensen
2020-04-15 10:54   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 11/16] nvme: factor out block backend setup Klaus Jensen
2020-04-15 10:52   ` Philippe Mathieu-Daudé
2020-04-15 11:02     ` Klaus Birkelund Jensen
2020-04-15 11:21       ` Klaus Birkelund Jensen
2020-04-15 10:24 ` [PATCH 12/16] nvme: add namespace helpers Klaus Jensen
2020-04-15 10:36   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 13/16] nvme: factor out namespace setup Klaus Jensen
2020-04-15 10:38   ` Philippe Mathieu-Daudé
2020-04-15 10:53     ` Klaus Birkelund Jensen
2020-04-15 10:59       ` Klaus Birkelund Jensen
2020-04-15 10:24 ` [PATCH 14/16] nvme: factor out pci setup Klaus Jensen
2020-04-15 10:43   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 15/16] nvme: factor out cmb setup Klaus Jensen
2020-04-15 10:45   ` Philippe Mathieu-Daudé
2020-04-15 10:24 ` [PATCH 16/16] nvme: factor out controller identify setup Klaus Jensen
2020-04-15 11:07   ` Philippe Mathieu-Daudé
2020-04-15 13:35 ` [PATCH 00/16] nvme: refactoring and cleanups no-reply

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=7a7e84ad-0f1d-2b56-6001-daa3403ec674@redhat.com \
    --to=philmd@redhat.com \
    --cc=beata.michalska@linaro.org \
    --cc=its@irrelevant.dk \
    --cc=javier.gonz@samsung.com \
    --cc=k.jensen@samsung.com \
    --cc=kbusch@kernel.org \
    --cc=kwolf@redhat.com \
    --cc=mlevitsk@redhat.com \
    --cc=mreitz@redhat.com \
    --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.