All of lore.kernel.org
 help / color / mirror / Atom feed
From: Klaus Jensen <its@irrelevant.dk>
To: Minwoo Im <minwoo.im.dev@gmail.com>
Cc: Keith Busch <kbusch@kernel.org>, Kevin Wolf <kwolf@redhat.com>,
	qemu-devel@nongnu.org, qemu-block@nongnu.org,
	Max Reitz <mreitz@redhat.com>
Subject: Re: [PATCH V6 6/6] hw/block/nvme: support for shared namespace in subsystem
Date: Mon, 25 Jan 2021 20:53:11 +0100	[thread overview]
Message-ID: <YA8hp7keD+G9uE+8@apples.localdomain> (raw)
In-Reply-To: <20210124025450.11071-7-minwoo.im.dev@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 7476 bytes --]

On Jan 24 11:54, Minwoo Im wrote:
> nvme-ns device is registered to a nvme controller device during the
> initialization in nvme_register_namespace() in case that 'bus' property
> is given which means it's mapped to a single controller.
> 
> This patch introduced a new property 'subsys' just like the controller
> device instance did to map a namespace to a NVMe subsystem.
> 
> If 'subsys' property is given to the nvme-ns device, it will belong to
> the specified subsystem and will be attached to all controllers in that
> subsystem by enabling shared namespace capability in NMIC(Namespace
> Multi-path I/O and Namespace Capabilities) in Identify Namespace.
> 
> Usage:
> 
>   -device nvme-subsys,id=subsys0
>   -device nvme,serial=foo,id=nvme0,subsys=subsys0
>   -device nvme,serial=bar,id=nvme1,subsys=subsys0
>   -device nvme,serial=baz,id=nvme2,subsys=subsys0
>   -device nvme-ns,id=ns1,drive=<drv>,nsid=1,subsys=subsys0  # Shared
>   -device nvme-ns,id=ns2,drive=<drv>,nsid=2,bus=nvme2       # Non-shared
> 
>   In the above example, 'ns1' will be shared to 'nvme0' and 'nvme1' in
>   the same subsystem.  On the other hand, 'ns2' will be attached to the
>   'nvme2' only as a private namespace in that subsystem.
> 
> All the namespace with 'subsys' parameter will attach all controllers in
> the subsystem to the namespace by default.
> 
> Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
> ---
>  hw/block/nvme-ns.c     | 23 ++++++++++++++++++-----
>  hw/block/nvme-ns.h     |  7 +++++++
>  hw/block/nvme-subsys.c | 25 +++++++++++++++++++++++++
>  hw/block/nvme-subsys.h |  3 +++
>  hw/block/nvme.c        | 10 +++++++++-
>  5 files changed, 62 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c
> index 62b25cf69bfa..9b493f2ead03 100644
> --- a/hw/block/nvme-ns.c
> +++ b/hw/block/nvme-ns.c
> @@ -63,6 +63,10 @@ static int nvme_ns_init(NvmeNamespace *ns, Error **errp)
>  
>      id_ns->npda = id_ns->npdg = npdg - 1;
>  
> +    if (nvme_ns_shared(ns)) {
> +        id_ns->nmic |= NVME_NMIC_NS_SHARED;
> +    }
> +
>      return 0;
>  }
>  
> @@ -365,16 +369,25 @@ static void nvme_ns_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> -    if (nvme_register_namespace(n, ns, errp)) {
> -        error_propagate_prepend(errp, local_err,
> -                                "could not register namespace: ");
> -        return;
> +    if (ns->subsys) {
> +        if (nvme_subsys_register_ns(ns, errp)) {
> +            error_propagate_prepend(errp, local_err,
> +                                    "could not setup namespace to subsys: ");
> +            return;
> +        }
> +    } else {
> +        if (nvme_register_namespace(n, ns, errp)) {
> +            error_propagate_prepend(errp, local_err,
> +                                    "could not register namespace: ");
> +            return;
> +        }
>      }
> -
>  }
>  
>  static Property nvme_ns_props[] = {
>      DEFINE_BLOCK_PROPERTIES(NvmeNamespace, blkconf),
> +    DEFINE_PROP_LINK("subsys", NvmeNamespace, subsys, TYPE_NVME_SUBSYS,
> +                     NvmeSubsystem *),
>      DEFINE_PROP_UINT32("nsid", NvmeNamespace, params.nsid, 0),
>      DEFINE_PROP_UUID("uuid", NvmeNamespace, params.uuid),
>      DEFINE_PROP_BOOL("zoned", NvmeNamespace, params.zoned, false),
> diff --git a/hw/block/nvme-ns.h b/hw/block/nvme-ns.h
> index 293ac990e3f6..929e78861903 100644
> --- a/hw/block/nvme-ns.h
> +++ b/hw/block/nvme-ns.h
> @@ -47,6 +47,8 @@ typedef struct NvmeNamespace {
>      const uint32_t *iocs;
>      uint8_t      csi;
>  
> +    NvmeSubsystem   *subsys;
> +
>      NvmeIdNsZoned   *id_ns_zoned;
>      NvmeZone        *zone_array;
>      QTAILQ_HEAD(, NvmeZone) exp_open_zones;
> @@ -77,6 +79,11 @@ static inline uint32_t nvme_nsid(NvmeNamespace *ns)
>      return -1;
>  }
>  
> +static inline bool nvme_ns_shared(NvmeNamespace *ns)
> +{
> +    return !!ns->subsys;
> +}
> +
>  static inline NvmeLBAF *nvme_ns_lbaf(NvmeNamespace *ns)
>  {
>      NvmeIdNs *id_ns = &ns->id_ns;
> diff --git a/hw/block/nvme-subsys.c b/hw/block/nvme-subsys.c
> index e9d61c993c90..641de33e99fc 100644
> --- a/hw/block/nvme-subsys.c
> +++ b/hw/block/nvme-subsys.c
> @@ -43,6 +43,31 @@ int nvme_subsys_register_ctrl(NvmeCtrl *n, Error **errp)
>      return cntlid;
>  }
>  
> +int nvme_subsys_register_ns(NvmeNamespace *ns, Error **errp)
> +{
> +    NvmeSubsystem *subsys = ns->subsys;
> +    NvmeCtrl *n;
> +    int i;
> +
> +    if (subsys->namespaces[nvme_nsid(ns)]) {
> +        error_setg(errp, "namespace %d already registerd to subsy %s",

Small typo.

"registerEd to subsySTEM"

> +                   nvme_nsid(ns), subsys->parent_obj.id);
> +        return -1;
> +    }
> +
> +    subsys->namespaces[nvme_nsid(ns)] = ns;
> +
> +    for (i = 0; i < ARRAY_SIZE(subsys->ctrls); i++) {
> +        n = subsys->ctrls[i];
> +
> +        if (n && nvme_register_namespace(n, ns, errp)) {
> +            return -1;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>  static void nvme_subsys_setup(NvmeSubsystem *subsys)
>  {
>      snprintf((char *)subsys->subnqn, sizeof(subsys->subnqn),
> diff --git a/hw/block/nvme-subsys.h b/hw/block/nvme-subsys.h
> index 4eba50d96a1d..ccf6a71398d3 100644
> --- a/hw/block/nvme-subsys.h
> +++ b/hw/block/nvme-subsys.h
> @@ -14,6 +14,7 @@
>      OBJECT_CHECK(NvmeSubsystem, (obj), TYPE_NVME_SUBSYS)
>  
>  #define NVME_SUBSYS_MAX_CTRLS   32
> +#define NVME_SUBSYS_MAX_NAMESPACES  32
>  
>  typedef struct NvmeCtrl NvmeCtrl;
>  typedef struct NvmeNamespace NvmeNamespace;
> @@ -22,8 +23,10 @@ typedef struct NvmeSubsystem {
>      uint8_t     subnqn[256];
>  
>      NvmeCtrl    *ctrls[NVME_SUBSYS_MAX_CTRLS];
> +    NvmeNamespace *namespaces[NVME_SUBSYS_MAX_NAMESPACES];
>  } NvmeSubsystem;
>  
>  int nvme_subsys_register_ctrl(NvmeCtrl *n, Error **errp);
> +int nvme_subsys_register_ns(NvmeNamespace *ns, Error **errp);
>  
>  #endif /* NVME_SUBSYS_H */
> diff --git a/hw/block/nvme.c b/hw/block/nvme.c
> index 7138389be4bd..8259dbf48ec0 100644
> --- a/hw/block/nvme.c
> +++ b/hw/block/nvme.c
> @@ -25,7 +25,8 @@
>   *              mdts=<N[optional]>,zoned.append_size_limit=<N[optional]>, \
>   *              subsys=<subsys_id> \
>   *      -device nvme-ns,drive=<drive_id>,bus=<bus_name>,nsid=<nsid>,\
> - *              zoned=<true|false[optional]>
> + *              zoned=<true|false[optional]>, \
> + *              subsys=<subsys_id>
>   *      -device nvme-subsys,id=<subsys_id>
>   *
>   * Note cmb_size_mb denotes size of CMB in MB. CMB is assumed to be at
> @@ -70,6 +71,13 @@
>   *   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.
>   *
> + * nvme namespace device parameters
> + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + * - `subsys`
> + *   NVM Subsystem device.  If given, this namespace will be attached to all
> + *   controllers in the subsystem. Otherwise, `bus` must be given to attach
> + *   this namespace to a specified single controller as a non-shared namespace.
> + *
>   * Setting `zoned` to true selects Zoned Command Set at the namespace.
>   * In this case, the following namespace properties are available to configure
>   * zoned operation:
> -- 
> 2.17.1
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2021-01-25 19:58 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-24  2:54 [PATCH V6 0/6] hw/block/nvme: support multi-path for ctrl/ns Minwoo Im
2021-01-24  2:54 ` [PATCH V6 1/6] hw/block/nvme: introduce nvme-subsys device Minwoo Im
2021-01-25 19:58   ` Klaus Jensen
2021-01-24  2:54 ` [PATCH V6 2/6] hw/block/nvme: support to map controller to a subsystem Minwoo Im
2021-01-24  2:54 ` [PATCH V6 3/6] hw/block/nvme: add CMIC enum value for Identify Controller Minwoo Im
2021-01-24  2:54 ` [PATCH V6 4/6] hw/block/nvme: support for multi-controller in subsystem Minwoo Im
2021-01-25 18:03   ` Klaus Jensen
2021-01-25 18:11     ` Keith Busch
2021-01-26  0:52       ` Minwoo Im
2021-01-26 17:57         ` Keith Busch
2021-01-26 20:44           ` Minwoo Im
2021-01-24  2:54 ` [PATCH V6 5/6] hw/block/nvme: add NMIC enum value for Identify Namespace Minwoo Im
2021-01-24  2:54 ` [PATCH V6 6/6] hw/block/nvme: support for shared namespace in subsystem Minwoo Im
2021-01-25 19:53   ` Klaus Jensen [this message]
2021-01-25 20:29 ` [PATCH V6 0/6] hw/block/nvme: support multi-path for ctrl/ns Klaus Jensen
2021-01-26  0:53   ` Minwoo Im
2021-01-26 20:39 ` Keith Busch
2021-01-26 21:41   ` Minwoo Im
2021-02-04 18:31 ` Klaus Jensen
2021-02-04 18:32   ` 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=YA8hp7keD+G9uE+8@apples.localdomain \
    --to=its@irrelevant.dk \
    --cc=kbusch@kernel.org \
    --cc=kwolf@redhat.com \
    --cc=minwoo.im.dev@gmail.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.