anitazha / rpms / ndctl

Forked from rpms/ndctl 2 years ago
Clone

Blame e086106-libndctl-papr-Fix-probe-for-papr-scm-compatible-nvdimms.patch

Bryan Gurney bc084d
libndctl/papr: Fix probe for papr-scm compatible nvdimms
Bryan Gurney bc084d
Bryan Gurney bc084d
BZ: 
Bryan Gurney bc084d
Brew: 
Bryan Gurney bc084d
Bryan Gurney bc084d
commit e086106b4d81a2079141c848db7695451c04e877
Bryan Gurney bc084d
Author: Vaibhav Jain <vaibhav@linux.ibm.com>
Bryan Gurney bc084d
Date:   Mon May 17 21:18:24 2021 +0530
Bryan Gurney bc084d
Bryan Gurney bc084d
    libndctl/papr: Fix probe for papr-scm compatible nvdimms
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    With recent changes introduced for unification of PAPR and NFIT
Bryan Gurney bc084d
    families the probe for papr-scm nvdimms is broken since they don't
Bryan Gurney bc084d
    expose 'handle' or 'phys_id' sysfs attributes. These attributes are
Bryan Gurney bc084d
    only exposed by NFIT and 'nvdimm_test' nvdimms. Since 'unable to read'
Bryan Gurney bc084d
    these sysfs attributes is a non-recoverable error hence this prevents
Bryan Gurney bc084d
    probing of 'PAPR-SCM' nvdimms and ndctl reports following error:
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    $ sudo NDCTL_LOG=debug ndctl list -DH
Bryan Gurney bc084d
    libndctl: ndctl_new: ctx 0x10015342c70 created
Bryan Gurney bc084d
    libndctl: add_dimm: nmem1: probe failed: Operation not permitted
Bryan Gurney bc084d
    libndctl: __sysfs_device_parse: nmem1: add_dev() failed
Bryan Gurney bc084d
    libndctl: add_dimm: nmem0: probe failed: Operation not permitted
Bryan Gurney bc084d
    libndctl: __sysfs_device_parse: nmem0: add_dev() failed
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    Fixing this bug is complicated by the fact these attributes are needed
Bryan Gurney bc084d
    for by the 'nvdimm_test' nvdimms which also uses the
Bryan Gurney bc084d
    NVDIMM_FAMILY_PAPR. Adding a two way comparison for these two
Bryan Gurney bc084d
    attributes in populate_dimm_attributes() to distinguish between
Bryan Gurney bc084d
    'nvdimm_test' and papr-scm nvdimms will be clunky and make future
Bryan Gurney bc084d
    updates to populate_dimm_attributes() error prone.
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    So, this patch proposes to fix the issue by re-introducing
Bryan Gurney bc084d
    add_papr_dimm() to probe both papr-scm and 'nvdimm_test' nvdimms. The
Bryan Gurney bc084d
    'compatible' sysfs attribute associated with the PAPR device is used
Bryan Gurney bc084d
    to distinguish between the two nvdimm types and in case an
Bryan Gurney bc084d
    'nvdimm_test' device is detected then forward its probe to
Bryan Gurney bc084d
    populate_dimm_attributes().
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    families")
Bryan Gurney bc084d
    
Bryan Gurney bc084d
    Link: https://lore.kernel.org/r/20210517154824.142237-1-vaibhav@linux.ibm.com
Bryan Gurney bc084d
    Fixes: daef3a386a9c("libndctl: Unify adding dimms for papr and nfit
Bryan Gurney bc084d
    Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Bryan Gurney bc084d
    Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Bryan Gurney bc084d
Bryan Gurney bc084d
diff -up ndctl-71.1/ndctl/lib/libndctl.c.orig ndctl-71.1/ndctl/lib/libndctl.c
Bryan Gurney bc084d
--- ndctl-71.1/ndctl/lib/libndctl.c.orig	2022-06-06 17:16:20.703762581 -0400
Bryan Gurney bc084d
+++ ndctl-71.1/ndctl/lib/libndctl.c	2022-06-06 17:17:34.932019990 -0400
Bryan Gurney bc084d
@@ -1757,6 +1757,58 @@ static int populate_dimm_attributes(stru
Bryan Gurney bc084d
 	return rc;
Bryan Gurney bc084d
 }
Bryan Gurney bc084d
 
Bryan Gurney bc084d
+static int add_papr_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
Bryan Gurney bc084d
+{
Bryan Gurney bc084d
+	int rc = -ENODEV;
Bryan Gurney bc084d
+	char buf[SYSFS_ATTR_SIZE];
Bryan Gurney bc084d
+	struct ndctl_ctx *ctx = dimm->bus->ctx;
Bryan Gurney bc084d
+	char *path = calloc(1, strlen(dimm_base) + 100);
Bryan Gurney bc084d
+	const char * const devname = ndctl_dimm_get_devname(dimm);
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	dbg(ctx, "%s: Probing of_pmem dimm at %s\n", devname, dimm_base);
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	if (!path)
Bryan Gurney bc084d
+		return -ENOMEM;
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	/* Check the compatibility of the probed nvdimm */
Bryan Gurney bc084d
+	sprintf(path, "%s/../of_node/compatible", dimm_base);
Bryan Gurney bc084d
+	if (sysfs_read_attr(ctx, path, buf) < 0) {
Bryan Gurney bc084d
+		dbg(ctx, "%s: Unable to read compatible field\n", devname);
Bryan Gurney bc084d
+		rc =  -ENODEV;
Bryan Gurney bc084d
+		goto out;
Bryan Gurney bc084d
+	}
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	dbg(ctx, "%s:Compatible of_pmem = '%s'\n", devname, buf);
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	/* Probe for papr-scm memory */
Bryan Gurney bc084d
+	if (strcmp(buf, "ibm,pmemory") == 0) {
Bryan Gurney bc084d
+		/* Read the dimm flags file */
Bryan Gurney bc084d
+		sprintf(path, "%s/papr/flags", dimm_base);
Bryan Gurney bc084d
+		if (sysfs_read_attr(ctx, path, buf) < 0) {
Bryan Gurney bc084d
+			rc = -errno;
Bryan Gurney bc084d
+			err(ctx, "%s: Unable to read dimm-flags\n", devname);
Bryan Gurney bc084d
+			goto out;
Bryan Gurney bc084d
+		}
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+		dbg(ctx, "%s: Adding papr-scm dimm flags:\"%s\"\n", devname, buf);
Bryan Gurney bc084d
+		dimm->cmd_family = NVDIMM_FAMILY_PAPR;
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+		/* Parse dimm flags */
Bryan Gurney bc084d
+		parse_papr_flags(dimm, buf);
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+		/* Allocate monitor mode fd */
Bryan Gurney bc084d
+		dimm->health_eventfd = open(path, O_RDONLY|O_CLOEXEC);
Bryan Gurney bc084d
+		rc = 0;
Bryan Gurney bc084d
+
Bryan Gurney bc084d
+	} else if (strcmp(buf, "nvdimm_test") == 0) {
Bryan Gurney bc084d
+		/* probe via common populate_dimm_attributes() */
Bryan Gurney bc084d
+		rc = populate_dimm_attributes(dimm, dimm_base, "papr");
Bryan Gurney bc084d
+	}
Bryan Gurney bc084d
+out:
Bryan Gurney bc084d
+	free(path);
Bryan Gurney bc084d
+	return rc;
Bryan Gurney bc084d
+}
Bryan Gurney bc084d
+
Bryan Gurney bc084d
 static void *add_dimm(void *parent, int id, const char *dimm_base)
Bryan Gurney bc084d
 {
Bryan Gurney bc084d
 	int formats, i, rc = -ENODEV;
Bryan Gurney bc084d
@@ -1848,8 +1900,9 @@ static void *add_dimm(void *parent, int
Bryan Gurney bc084d
 	/* Check if the given dimm supports nfit */
Bryan Gurney bc084d
 	if (ndctl_bus_has_nfit(bus)) {
Bryan Gurney bc084d
 		rc = populate_dimm_attributes(dimm, dimm_base, "nfit");
Bryan Gurney bc084d
-	} else if (ndctl_bus_has_of_node(bus))
Bryan Gurney bc084d
-		rc = populate_dimm_attributes(dimm, dimm_base, "papr");
Bryan Gurney bc084d
+	} else if (ndctl_bus_has_of_node(bus)) {
Bryan Gurney bc084d
+		rc = add_papr_dimm(dimm, dimm_base);
Bryan Gurney bc084d
+	}
Bryan Gurney bc084d
 
Bryan Gurney bc084d
 	if (rc == -ENODEV) {
Bryan Gurney bc084d
 		/* Unprobed dimm with no family */