Message ID | 153724975617.55312.7253687867673718680.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ndctl: Remove udev rule for latch and dirty-shutdown-count | expand |
On Mon, 2018-09-17 at 22:49 -0700, Dan Williams wrote: > 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 <keith.busch@intel.com> > Cc: Vishal Verma <vishal.l.verma@intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > 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 The series generally looks good to me, just a couple comments below: > > 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); Shouldn't we report any errors here? > + ndctl_cmd_unref(cmd); > + > + return 0; ^ stray whitespace? > +}
On Tue, Sep 18, 2018 at 12:15 PM Verma, Vishal L <vishal.l.verma@intel.com> wrote: > > > On Mon, 2018-09-17 at 22:49 -0700, Dan Williams wrote: > > 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 <keith.busch@intel.com> > > Cc: Vishal Verma <vishal.l.verma@intel.com> > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > > --- > > 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 > > The series generally looks good to me, just a couple comments below: > > > > > 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); > > Shouldn't we report any errors here? Yeah, I expect failure here is likely to be common, so we shouldn't be silent about it. > > + ndctl_cmd_unref(cmd); > > + > > + return 0; > > ^ stray whitespace? Yup, and now I also a few asciidoctor reported nits, will resend.
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 },
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 <keith.busch@intel.com> Cc: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- 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