bc084de093
We could not rebase to v73 because there was an incompatible config file change (the file both changed in format and moved location). Unfortunately, that configuration change also added externally facing APIs, and with them, new versioned symbols. As a result, I couldn't pull in all fixes because it would result in an incompatible list of symbols in a given ABI version. Long term, upstream is aware of the config file problem, and is looking to address it by supporting both old and new formats and locations. This update addresses the following reported bugs: - Fix enable-namespace all reporting errors incorrectly - Add support for inject-smart on papr scm Related: rhbz#2040075 Related: rhbz#1873851 Related: rhbz#1880578 Related: rhbz#1922538 Related: rhbz#2087707 Signed-off-by: Bryan Gurney <bgurney@redhat.com>
134 lines
4.4 KiB
Diff
134 lines
4.4 KiB
Diff
libndctl/papr: Add support for reporting shutdown-count
|
|
|
|
BZ:
|
|
Brew:
|
|
|
|
commit aa990008f48f21121474a411d829f24e832c89a2
|
|
Author: Vaibhav Jain <vaibhav@linux.ibm.com>
|
|
Date: Tue Jan 25 00:26:05 2022 +0530
|
|
|
|
libndctl/papr: Add support for reporting shutdown-count
|
|
|
|
Add support for reporting dirty-shutdown-count (DSC) for PAPR based
|
|
NVDIMMs. The sysfs attribute exposing this value is located at
|
|
nmemX/papr/dirty_shutdown.
|
|
|
|
This counter is also returned in payload for PAPR_PDSM_HEALTH as newly
|
|
introduced member 'dimm_dsc' in 'struct nd_papr_pdsm_health'. Presence
|
|
of 'DSC' is indicated by the PDSM_DIMM_DSC_VALID extension flag.
|
|
|
|
The patch implements 'ndctl_dimm_ops.smart_get_shutdown_count'
|
|
callback in implemented as papr_smart_get_shutdown_count().
|
|
|
|
Kernel side changes to support reporting DSC have been merged to linux kernel
|
|
via patch proposed at [1]. With updated kernel 'ndctl list -DH' reports
|
|
following output on PPC64:
|
|
|
|
$ sudo ndctl list -DH
|
|
[
|
|
{
|
|
"dev":"nmem0",
|
|
"health":{
|
|
"health_state":"ok",
|
|
"life_used_percentage":50,
|
|
"shutdown_state":"clean",
|
|
"shutdown_count":10
|
|
}
|
|
}
|
|
]
|
|
|
|
[1] http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20210624080621.252038-1-vaibhav@linux.ibm.com
|
|
|
|
Link: https://lore.kernel.org/r/20220124185605.1465681-1-vaibhav@linux.ibm.com
|
|
Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
|
|
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
|
|
|
|
diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
|
|
index 47a234c..5979a92 100644
|
|
--- a/ndctl/lib/libndctl.c
|
|
+++ b/ndctl/lib/libndctl.c
|
|
@@ -1819,8 +1819,12 @@ static int add_papr_dimm(struct ndctl_dimm *dimm, const char *dimm_base)
|
|
|
|
/* Allocate monitor mode fd */
|
|
dimm->health_eventfd = open(path, O_RDONLY|O_CLOEXEC);
|
|
- rc = 0;
|
|
+ /* Get the dirty shutdown counter value */
|
|
+ sprintf(path, "%s/papr/dirty_shutdown", dimm_base);
|
|
+ if (sysfs_read_attr(ctx, path, buf) == 0)
|
|
+ dimm->dirty_shutdown = strtoll(buf, NULL, 0);
|
|
|
|
+ rc = 0;
|
|
} else if (strcmp(buf, "nvdimm_test") == 0) {
|
|
/* probe via common populate_dimm_attributes() */
|
|
rc = populate_dimm_attributes(dimm, dimm_base, "papr");
|
|
diff --git a/ndctl/lib/papr.c b/ndctl/lib/papr.c
|
|
index 43b8412..46cf9c1 100644
|
|
--- a/ndctl/lib/papr.c
|
|
+++ b/ndctl/lib/papr.c
|
|
@@ -165,6 +165,9 @@ static unsigned int papr_smart_get_flags(struct ndctl_cmd *cmd)
|
|
if (health.extension_flags & PDSM_DIMM_HEALTH_RUN_GAUGE_VALID)
|
|
flags |= ND_SMART_USED_VALID;
|
|
|
|
+ if (health.extension_flags & PDSM_DIMM_DSC_VALID)
|
|
+ flags |= ND_SMART_SHUTDOWN_COUNT_VALID;
|
|
+
|
|
return flags;
|
|
}
|
|
|
|
@@ -236,6 +239,25 @@ static unsigned int papr_smart_get_life_used(struct ndctl_cmd *cmd)
|
|
(100 - health.dimm_fuel_gauge) : 0;
|
|
}
|
|
|
|
+static unsigned int papr_smart_get_shutdown_count(struct ndctl_cmd *cmd)
|
|
+{
|
|
+
|
|
+ struct nd_papr_pdsm_health health;
|
|
+
|
|
+ /* Ignore in case of error or invalid pdsm */
|
|
+ if (!cmd_is_valid(cmd) ||
|
|
+ to_pdsm(cmd)->cmd_status != 0 ||
|
|
+ to_pdsm_cmd(cmd) != PAPR_PDSM_HEALTH)
|
|
+ return 0;
|
|
+
|
|
+ /* get the payload from command */
|
|
+ health = to_payload(cmd)->health;
|
|
+
|
|
+ return (health.extension_flags & PDSM_DIMM_DSC_VALID) ?
|
|
+ (health.dimm_dsc) : 0;
|
|
+
|
|
+}
|
|
+
|
|
struct ndctl_dimm_ops * const papr_dimm_ops = &(struct ndctl_dimm_ops) {
|
|
.cmd_is_supported = papr_cmd_is_supported,
|
|
.smart_get_flags = papr_smart_get_flags,
|
|
@@ -245,4 +267,5 @@ struct ndctl_dimm_ops * const papr_dimm_ops = &(struct ndctl_dimm_ops) {
|
|
.smart_get_health = papr_smart_get_health,
|
|
.smart_get_shutdown_state = papr_smart_get_shutdown_state,
|
|
.smart_get_life_used = papr_smart_get_life_used,
|
|
+ .smart_get_shutdown_count = papr_smart_get_shutdown_count,
|
|
};
|
|
diff --git a/ndctl/lib/papr_pdsm.h b/ndctl/lib/papr_pdsm.h
|
|
index 1bac8a7..f45b1e4 100644
|
|
--- a/ndctl/lib/papr_pdsm.h
|
|
+++ b/ndctl/lib/papr_pdsm.h
|
|
@@ -75,6 +75,9 @@
|
|
/* Indicate that the 'dimm_fuel_gauge' field is valid */
|
|
#define PDSM_DIMM_HEALTH_RUN_GAUGE_VALID 1
|
|
|
|
+/* Indicate that the 'dimm_dsc' field is valid */
|
|
+#define PDSM_DIMM_DSC_VALID 2
|
|
+
|
|
/*
|
|
* Struct exchanged between kernel & ndctl in for PAPR_PDSM_HEALTH
|
|
* Various flags indicate the health status of the dimm.
|
|
@@ -103,6 +106,9 @@ struct nd_papr_pdsm_health {
|
|
|
|
/* Extension flag PDSM_DIMM_HEALTH_RUN_GAUGE_VALID */
|
|
__u16 dimm_fuel_gauge;
|
|
+
|
|
+ /* Extension flag PDSM_DIMM_DSC_VALID */
|
|
+ __u64 dimm_dsc;
|
|
};
|
|
__u8 buf[ND_PDSM_PAYLOAD_MAX_SIZE];
|
|
};
|