Some DIMMs provide a facility to track dirty-shutdown events. The counter only rolls forward after the OS sets a latch. This allows the agent tracking dirty shutdowns to ignore events that occur while the capacity has not been written. For these DIMMs dirty-dimm will trigger the counter to roll to the next state. The shutdown state can be retrieved with 'ndctl list -DH'
Cc: Keith Busch <[email protected]> Cc: Vishal Verma <[email protected]> Signed-off-by: Dan Williams <[email protected]> --- Documentation/ndctl/Makefile.am | 1 + Documentation/ndctl/ndctl-dirty-dimm.txt | 29 +++++++++++++++++++++++++++++ builtin.h | 1 + ndctl/dimm.c | 28 ++++++++++++++++++++++++++++ ndctl/ndctl.c | 1 + 5 files changed, 60 insertions(+) create mode 100644 Documentation/ndctl/ndctl-dirty-dimm.txt diff --git a/Documentation/ndctl/Makefile.am b/Documentation/ndctl/Makefile.am index a30b139ba3a3..1a826bb001be 100644 --- a/Documentation/ndctl/Makefile.am +++ b/Documentation/ndctl/Makefile.am @@ -38,6 +38,7 @@ man1_MANS = \ ndctl-disable-region.1 \ ndctl-enable-dimm.1 \ ndctl-disable-dimm.1 \ + ndctl-dirty-dimm.1 \ ndctl-enable-namespace.1 \ ndctl-disable-namespace.1 \ ndctl-create-namespace.1 \ diff --git a/Documentation/ndctl/ndctl-dirty-dimm.txt b/Documentation/ndctl/ndctl-dirty-dimm.txt new file mode 100644 index 000000000000..5c0b97f37ad6 --- /dev/null +++ b/Documentation/ndctl/ndctl-dirty-dimm.txt @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 + +ndctl-dirty-dimm(1) +===================== + +NAME +---- +ndctl-dirty-dimm - set dimm to record the next dirty shutdown event + +SYNOPSIS +-------- +[verse] +'ndctl dirty-dimm <nmem0> [<nmem1>..<nmemN>]' + +Some NVDIMMs have the capability to detect 'flush failed' events whereby +data that is pending in buffers at the time of system power loss fail to +be flushed out to media. Some DIMMs go further to count how many times +such fatal events occur, but only roll the count in response to a latch +being set. The 'dirty-dimm' command sets this latch on those devices and +is meant to be called in advance to any writes to media. + +OPTIONS +------- +<nmem>:: +include::xable-dimm-options.txt[] + +SEE ALSO +-------- +http://pmem.io/documents/NVDIMM_DSM_Interface-V1.7.pdf[NVDIMM DSM Inteface] diff --git a/builtin.h b/builtin.h index 675a6ce79b9c..1157243cdf60 100644 --- a/builtin.h +++ b/builtin.h @@ -48,4 +48,5 @@ int cmd_bat(int argc, const char **argv, void *ctx); #endif int cmd_update_firmware(int argc, const char **argv, void *ctx); int cmd_inject_smart(int argc, const char **argv, void *ctx); +int cmd_dirty_dimm(int argc, const char **argv, void *ctx); #endif /* _NDCTL_BUILTIN_H_ */ diff --git a/ndctl/dimm.c b/ndctl/dimm.c index a4203f354000..595e4e4096a5 100644 --- a/ndctl/dimm.c +++ b/ndctl/dimm.c @@ -61,6 +61,19 @@ static int action_zero(struct ndctl_dimm *dimm, struct action_context *actx) return ndctl_dimm_zero_labels(dimm); } +static int action_dirty(struct ndctl_dimm *dimm, struct action_context *actx) +{ + struct ndctl_cmd *cmd; + + cmd = ndctl_dimm_cmd_new_ack_shutdown_count(dimm); + if (!cmd) + return -EOPNOTSUPP; + ndctl_cmd_submit(cmd); + ndctl_cmd_unref(cmd); + + return 0; +} + static struct json_object *dump_label_json(struct ndctl_dimm *dimm, struct ndctl_cmd *cmd_read, ssize_t size) { @@ -943,6 +956,11 @@ static const struct option update_options[] = { OPT_END(), }; +static const struct option dirty_options[] = { + BASE_OPTIONS(), + OPT_END(), +}; + static const struct option base_options[] = { BASE_OPTIONS(), OPT_END(), @@ -1181,3 +1199,13 @@ int cmd_update_firmware(int argc, const char **argv, void *ctx) count > 1 ? "s" : ""); return count >= 0 ? 0 : EXIT_FAILURE; } + +int cmd_dirty_dimm(int argc, const char **argv, void *ctx) +{ + int count = dimm_action(argc, argv, ctx, action_dirty, dirty_options, + "ndctl dirty-dimm <nmem0> [<nmem1>..<nmemN>] [<options>]"); + + fprintf(stderr, "dirtied %d nmem%s.\n", count >= 0 ? count : 0, + count > 1 ? "s" : ""); + return count >= 0 ? 0 : EXIT_FAILURE; +} diff --git a/ndctl/ndctl.c b/ndctl/ndctl.c index 73dabfac3908..93d0d88a274c 100644 --- a/ndctl/ndctl.c +++ b/ndctl/ndctl.c @@ -83,6 +83,7 @@ static struct cmd_struct commands[] = { { "write-labels", cmd_write_labels }, { "init-labels", cmd_init_labels }, { "check-labels", cmd_check_labels }, + { "dirty-dimm", cmd_dirty_dimm }, { "inject-error", cmd_inject_error }, { "update-firmware", cmd_update_firmware }, { "inject-smart", cmd_inject_smart }, _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
