Re: [PATCH v2 4/4] cxl/region: Add trigger_poison_list sysfs attribute
From: Alison Schofield
Date: Mon Oct 17 2022 - 14:02:12 EST
On Mon, Oct 17, 2022 at 02:43:02PM +0100, Jonathan Cameron wrote:
> On Wed, 12 Oct 2022 14:28:20 -0700
> alison.schofield@xxxxxxxxx wrote:
>
> > From: Alison Schofield <alison.schofield@xxxxxxxxx>
> >
> > When a boolean 'true' is written to this attribute the region driver
> > retrieves the poison list for the capacity each device contributes
> > to this region. The list includes addresses that are poisoned, or
> > would result in poison if accessed, and the source of the poison.
> > The retrieved errors are logged as kernel trace events with the
> > label 'cxl_poison'.
> >
> > Devices not supporting the poison list capability are ignored.
> >
> > Signed-off-by: Alison Schofield <alison.schofield@xxxxxxxxx>
>
> Hi Alison,
>
> For some reason I don't have cxl_dpa_resource().
> Should that be cxl_dpa_resource_start()?
Yes.
>
> Looks like it got renamed in
> cxl/hdm: Add support for allocating DPA to an endpoint decoder
> cf880423b6a0599499c1f83542cab0b75daa29ba
Looks like it got renamed during the patches review. Not worth
unravelling now. I will rebase in next version.
Sorry about that and thanks!
Alison
>
> Jonathan
>
> > +static ssize_t trigger_poison_list_store(struct device *dev,
> > + struct device_attribute *attr,
> > + const char *buf, size_t len)
> > +{
> > + struct cxl_region *cxlr = to_cxl_region(dev);
> > + struct cxl_region_params *p = &cxlr->params;
> > + struct cxl_endpoint_decoder *cxled;
> > + struct cxl_memdev *cxlmd;
> > + u64 offset, length;
> > + int rc, i;
> > + bool tmp;
> > +
> > + if (kstrtobool(buf, &tmp))
> > + return -EINVAL;
> > +
> > + for (i = 0; i < p->nr_targets; i++) {
> > + cxled = p->targets[i];
> > + cxlmd = cxled_to_memdev(cxled);
> > + if (!test_bit(CXL_MEM_COMMAND_ID_GET_POISON,
> > + cxlmd->cxlds->enabled_cmds))
> > + continue;
> > + offset = cxl_dpa_resource(cxled);
> > + length = cxl_dpa_size(cxled);
> > + rc = cxl_mem_get_poison(cxlmd, offset, length,
> > + dev_name(&cxlr->dev));
> > + if (rc)
> > + return rc;
> > + }
> > + return len;
> > +}
> > +static DEVICE_ATTR_WO(trigger_poison_list);