Re: [PATCH 4/5] libnvdimm/region: Introduce NDD_LABELING

From: Aneesh Kumar K.V
Date: Mon Feb 03 2020 - 12:10:21 EST


Dan Williams <dan.j.williams@xxxxxxxxx> writes:

> The NDD_ALIASING flag is used to indicate where pmem capacity might
> alias with blk capacity and require labeling. It is also used to
> indicate whether the DIMM supports labeling. Separate this latter
> capability into its own flag so that the NDD_ALIASING flag is scoped to
> true aliased configurations.
>
> To my knowledge aliased configurations only exist in the ACPI spec,
> there are no known platforms that ship this support in production.
>
> This clarity allows namespace-capacity alignment constraints around
> interleave-ways to be relaxed.
>

Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx>

> Cc: Vishal Verma <vishal.l.verma@xxxxxxxxx>
> Cc: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx>
> Cc: Oliver O'Halloran <oohall@xxxxxxxxx>
> Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>
> ---
> arch/powerpc/platforms/pseries/papr_scm.c | 2 +-
> drivers/acpi/nfit/core.c | 4 +++-
> drivers/nvdimm/dimm.c | 2 +-
> drivers/nvdimm/dimm_devs.c | 9 +++++----
> drivers/nvdimm/namespace_devs.c | 2 +-
> drivers/nvdimm/nd.h | 2 +-
> drivers/nvdimm/region_devs.c | 10 +++++-----
> include/linux/libnvdimm.h | 2 ++
> 8 files changed, 19 insertions(+), 14 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c
> index c2ef320ba1bf..aae60cfd4e38 100644
> --- a/arch/powerpc/platforms/pseries/papr_scm.c
> +++ b/arch/powerpc/platforms/pseries/papr_scm.c
> @@ -326,7 +326,7 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
> }
>
> dimm_flags = 0;
> - set_bit(NDD_ALIASING, &dimm_flags);
> + set_bit(NDD_LABELING, &dimm_flags);
>
> p->nvdimm = nvdimm_create(p->bus, p, NULL, dimm_flags,
> PAPR_SCM_DIMM_CMD_MASK, 0, NULL);
> diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
> index a3320f93616d..71d7f2aa1b12 100644
> --- a/drivers/acpi/nfit/core.c
> +++ b/drivers/acpi/nfit/core.c
> @@ -2026,8 +2026,10 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
> continue;
> }
>
> - if (nfit_mem->bdw && nfit_mem->memdev_pmem)
> + if (nfit_mem->bdw && nfit_mem->memdev_pmem) {
> set_bit(NDD_ALIASING, &flags);
> + set_bit(NDD_LABELING, &flags);
> + }
>
> /* collate flags across all memdevs for this dimm */
> list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
> diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c
> index 64776ed15bb3..7d4ddc4d9322 100644
> --- a/drivers/nvdimm/dimm.c
> +++ b/drivers/nvdimm/dimm.c
> @@ -99,7 +99,7 @@ static int nvdimm_probe(struct device *dev)
> if (ndd->ns_current >= 0) {
> rc = nd_label_reserve_dpa(ndd);
> if (rc == 0)
> - nvdimm_set_aliasing(dev);
> + nvdimm_set_labeling(dev);
> }
> nvdimm_bus_unlock(dev);
>
> diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c
> index 94ea6dba6b4f..64159d4d4b8f 100644
> --- a/drivers/nvdimm/dimm_devs.c
> +++ b/drivers/nvdimm/dimm_devs.c
> @@ -32,7 +32,7 @@ int nvdimm_check_config_data(struct device *dev)
>
> if (!nvdimm->cmd_mask ||
> !test_bit(ND_CMD_GET_CONFIG_DATA, &nvdimm->cmd_mask)) {
> - if (test_bit(NDD_ALIASING, &nvdimm->flags))
> + if (test_bit(NDD_LABELING, &nvdimm->flags))
> return -ENXIO;
> else
> return -ENOTTY;
> @@ -173,11 +173,11 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
> return rc;
> }
>
> -void nvdimm_set_aliasing(struct device *dev)
> +void nvdimm_set_labeling(struct device *dev)
> {
> struct nvdimm *nvdimm = to_nvdimm(dev);
>
> - set_bit(NDD_ALIASING, &nvdimm->flags);
> + set_bit(NDD_LABELING, &nvdimm->flags);
> }
>
> void nvdimm_set_locked(struct device *dev)
> @@ -312,8 +312,9 @@ static ssize_t flags_show(struct device *dev,
> {
> struct nvdimm *nvdimm = to_nvdimm(dev);
>
> - return sprintf(buf, "%s%s\n",
> + return sprintf(buf, "%s%s%s\n",
> test_bit(NDD_ALIASING, &nvdimm->flags) ? "alias " : "",
> + test_bit(NDD_LABELING, &nvdimm->flags) ? "label" : "",
> test_bit(NDD_LOCKED, &nvdimm->flags) ? "lock " : "");
> }
> static DEVICE_ATTR_RO(flags);
> diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
> index aff1f32fdb4f..30cda9f235de 100644
> --- a/drivers/nvdimm/namespace_devs.c
> +++ b/drivers/nvdimm/namespace_devs.c
> @@ -2531,7 +2531,7 @@ static int init_active_labels(struct nd_region *nd_region)
> if (!ndd) {
> if (test_bit(NDD_LOCKED, &nvdimm->flags))
> /* fail, label data may be unreadable */;
> - else if (test_bit(NDD_ALIASING, &nvdimm->flags))
> + else if (test_bit(NDD_LABELING, &nvdimm->flags))
> /* fail, labels needed to disambiguate dpa */;
> else
> return 0;
> diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
> index c9f6a5b5253a..ca39abe29c7c 100644
> --- a/drivers/nvdimm/nd.h
> +++ b/drivers/nvdimm/nd.h
> @@ -252,7 +252,7 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
> void *buf, size_t len);
> long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
> unsigned int len);
> -void nvdimm_set_aliasing(struct device *dev);
> +void nvdimm_set_labeling(struct device *dev);
> void nvdimm_set_locked(struct device *dev);
> void nvdimm_clear_locked(struct device *dev);
> int nvdimm_security_setup_events(struct device *dev);
> diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
> index a19e535830d9..a5fc6e4c56ff 100644
> --- a/drivers/nvdimm/region_devs.c
> +++ b/drivers/nvdimm/region_devs.c
> @@ -195,16 +195,16 @@ EXPORT_SYMBOL_GPL(nd_blk_region_set_provider_data);
> int nd_region_to_nstype(struct nd_region *nd_region)
> {
> if (is_memory(&nd_region->dev)) {
> - u16 i, alias;
> + u16 i, label;
>
> - for (i = 0, alias = 0; i < nd_region->ndr_mappings; i++) {
> + for (i = 0, label = 0; i < nd_region->ndr_mappings; i++) {
> struct nd_mapping *nd_mapping = &nd_region->mapping[i];
> struct nvdimm *nvdimm = nd_mapping->nvdimm;
>
> - if (test_bit(NDD_ALIASING, &nvdimm->flags))
> - alias++;
> + if (test_bit(NDD_LABELING, &nvdimm->flags))
> + label++;
> }
> - if (alias)
> + if (label)
> return ND_DEVICE_NAMESPACE_PMEM;
> else
> return ND_DEVICE_NAMESPACE_IO;
> diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
> index 9df091bd30ba..18da4059be09 100644
> --- a/include/linux/libnvdimm.h
> +++ b/include/linux/libnvdimm.h
> @@ -37,6 +37,8 @@ enum {
> NDD_WORK_PENDING = 4,
> /* ignore / filter NSLABEL_FLAG_LOCAL for this DIMM, i.e. no aliasing */
> NDD_NOBLK = 5,
> + /* dimm supports namespace labels */
> + NDD_LABELING = 6,
>
> /* need to set a limit somewhere, but yes, this is likely overkill */
> ND_IOCTL_MAX_BUFLEN = SZ_4M,
> _______________________________________________
> Linux-nvdimm mailing list -- linux-nvdimm@xxxxxxxxxxxx
> To unsubscribe send an email to linux-nvdimm-leave@xxxxxxxxxxxx