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

Aneesh Kumar K.V aneesh.kumar at linux.ibm.com
Tue Feb 4 04:09:52 AEDT 2020


Dan Williams <dan.j.williams at intel.com> 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 at linux.ibm.com>

> Cc: Vishal Verma <vishal.l.verma at intel.com>
> Cc: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
> Cc: Oliver O'Halloran <oohall at gmail.com>
> Signed-off-by: Dan Williams <dan.j.williams at intel.com>
> ---
>  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 at lists.01.org
> To unsubscribe send an email to linux-nvdimm-leave at lists.01.org


More information about the Linuxppc-dev mailing list