On Wed, Sep 28, 2016 at 5:10 PM, Vishal Verma <[email protected]> wrote: > Starting a full Address Range Scrub (ARS) on hitting a memory error > machine check exception may not always be desirable. Provide a way > through sysfs to toggle the behavior between just adding the address > (cache line) where the MCE happened to the poison list and doing a full > scrub. The former (selective insertion of the address) is done > unconditionally.
> > Cc: [email protected] > Cc: Dan Williams <[email protected]> > Cc: Linda Knippers <[email protected]> > Cc: Rafael J. Wysocki <[email protected]> > Signed-off-by: Vishal Verma <[email protected]> > --- > drivers/acpi/nfit/core.c | 23 ++++++++++++++++++++--- > drivers/acpi/nfit/mce.c | 24 +++++++++++++++++++----- > drivers/acpi/nfit/nfit.h | 6 ++++++ > 3 files changed, 45 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c > index 80cc7c0..ec1069e 100644 > --- a/drivers/acpi/nfit/core.c > +++ b/drivers/acpi/nfit/core.c > @@ -901,6 +901,14 @@ static ssize_t scrub_show(struct device *dev, I think scrub_show() should display the current auto-scrub mode, right? > return rc; > } > > +/* > + * The 'scrub' attribute can only have following values written to it: > + * '1': Start an on-demand scrub, and enable a full scrub to happen if a > + * machine check exception for a memory error is received. > + * '2': Switch to the default mode where a machine check will only insert > + * the address on which the memory error was received into the poison > + * and badblocks lists. > + */ > static ssize_t scrub_store(struct device *dev, > struct device_attribute *attr, const char *buf, size_t size) > { > @@ -911,15 +919,24 @@ static ssize_t scrub_store(struct device *dev, > rc = kstrtol(buf, 0, &val); > if (rc) > return rc; > - if (val != 1) > - return -EINVAL; > > device_lock(dev); > nd_desc = dev_get_drvdata(dev); > if (nd_desc) { > struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc); > > - rc = acpi_nfit_ars_rescan(acpi_desc); > + switch (val) { > + case MCE_SCRUB_ON: > + rc = acpi_nfit_ars_rescan(acpi_desc); > + acpi_desc->scrub_mode = MCE_SCRUB_ON; > + break; > + case MCE_SCRUB_OFF: > + acpi_desc->scrub_mode = MCE_SCRUB_OFF; > + break; Shouldn't this still kick off a scrub? It's awkward that the only way to run a scrub is to put the driver into automatic re-scrub mode. _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
