From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: <alison.schofield@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
Ira Weiny <ira.weiny@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Ben Widawsky <bwidawsk@kernel.org>,
Dave Jiang <dave.jiang@intel.com>, <linux-cxl@vger.kernel.org>
Subject: Re: [PATCH 1/5] cxl/memdev: Add support for the Inject Poison mailbox command
Date: Wed, 30 Nov 2022 14:31:36 +0000 [thread overview]
Message-ID: <20221130143136.00003808@Huawei.com> (raw)
In-Reply-To: <3c260749c833f51d5cad9ae3912debcdf8b82753.1669781852.git.alison.schofield@intel.com>
On Tue, 29 Nov 2022 20:34:33 -0800
alison.schofield@intel.com wrote:
> From: Alison Schofield <alison.schofield@intel.com>
>
> CXL devices optionally support the INJECT POISON mailbox command. Add
> a sysfs attribute and memdev driver support for injecting poison.
>
> When a Device Physical Address (DPA) is written to the inject_poison
> sysfs attribute send an inject poison command to the device for the
> specified address.
>
> Per the CXL Specification (8.2.9.8.4.2), after receiving a valid
> inject poison request, the device will return poison when the address
> is accessed through the CXL.mem bus. Injecting poison adds the address
> to the device's Poison List and the error source is set to injected
> error. In addition, the device adds a poison creation event to its
> internal Informational Event log, updates the Event Status register,
> and if configured, interrupts the host.
>
> Also, per the CXL Specification, it is not an error to inject poison
> into an address that already has poison present and no error is returned
> from the device. The memdev driver performs basic sanity checking on the
> address, however, it does not go as far as reading the poison list to see
> if the address is on the list. That discovery is left to the device.
>
> The inject_poison attribute is only visible for devices supporting
> the capability.
>
> Signed-off-by: Alison Schofield <alison.schofield@intel.com>
A few trivial things inline. With those fixes LGTM
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---
> Documentation/ABI/testing/sysfs-bus-cxl | 19 +++++++++
> drivers/cxl/core/memdev.c | 53 +++++++++++++++++++++++++
> drivers/cxl/cxlmem.h | 3 ++
> 3 files changed, 75 insertions(+)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-cxl b/Documentation/ABI/testing/sysfs-bus-cxl
> index b715a4609718..20db97f7a1aa 100644
> --- a/Documentation/ABI/testing/sysfs-bus-cxl
> +++ b/Documentation/ABI/testing/sysfs-bus-cxl
> @@ -416,3 +416,22 @@ Description:
> if accessed, and the source of the poison. The retrieved
> errors are logged as kernel trace events with the label
> 'cxl_poison'.
> +
> +
> +What: /sys/bus/cxl/devices/memX/inject_poison
> +Date: December, 2022
> +KernelVersion: v6.2
> +Contact: linux-cxl@vger.kernel.org
> +Description:
> + (WO) When a Device Physical Address (DPA) is written to this
> + attribute the memdev driver sends an inject poison command to
> + the device for the specified address. If successful, the device
> + returns poison when the address is accessed through the CXL.mem
> + bus. Injecting poison adds the address to the device's Poison
> + List and the error source is set to injected error. In addition,
"set to Injected."
perhaps to match spec naming in Media Error Record.
> + the device adds a poison creation event to its internal
> + Informational Event log, updates the Event Status register, and
> + if configured, interrupts the host. It is not an error to inject
> + poison into an address that already has poison present and no
> + error is returned. The inject_poison attribute is only visible
> + for devices supporting the capability.
White space issues (spaces instead of tabs?)
Add something about the masked bits / granularity of addresses that are accepted.
> diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c
> index d08b7295a01c..71130813030f 100644
> --- a/drivers/cxl/core/memdev.c
> +++ b/drivers/cxl/core/memdev.c
> @@ -142,6 +142,51 @@ static ssize_t trigger_poison_list_store(struct device *dev,
> }
> static DEVICE_ATTR_WO(trigger_poison_list);
>
> +static int cxl_validate_poison_dpa(struct cxl_dev_state *cxlds, u64 dpa)
> +{
> + if (!resource_size(&cxlds->dpa_res)) {
> + dev_dbg(cxlds->dev, "device has no dpa resource\n");
> + return -EINVAL;
> + }
> + if (dpa < cxlds->dpa_res.start || dpa > cxlds->dpa_res.end) {
> + dev_dbg(cxlds->dev, "dpa:0x%llx not in resource:%pR\n",
> + dpa, &cxlds->dpa_res);
> + return -EINVAL;
> + }
> + if ((dpa & CXL_POISON_INJECT_RESERVED) != 0) {
> + dev_dbg(cxlds->dev, "dpa reserve bit(s) [5:0] set 0x%llx\n",
> + dpa);
> + return -EINVAL;
> + }
> + return 0;
> +}
> +
> +static ssize_t inject_poison_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t len)
> +{
> + struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
> + struct cxl_dev_state *cxlds = cxlmd->cxlds;
> + u64 dpa;
> + int rc;
> +
> + rc = kstrtou64(buf, 0, &dpa);
> + if (rc)
> + return rc;
> + rc = cxl_validate_poison_dpa(cxlds, dpa);
> + if (rc)
> + return rc;
> +
> + dpa = cpu_to_le64(dpa);
> + rc = cxl_mbox_send_cmd(cxlds, CXL_MBOX_OP_INJECT_POISON, &dpa,
Endianness?
> + sizeof(dpa), NULL, cxlds->payload_size);
> + if (rc)
> + return rc;
> +
> + return len;
> +}
> +static DEVICE_ATTR_WO(inject_poison);
> +
> static struct attribute *cxl_memdev_attributes[] = {
> &dev_attr_serial.attr,
> &dev_attr_firmware_version.attr,
> @@ -149,6 +194,7 @@ static struct attribute *cxl_memdev_attributes[] = {
> &dev_attr_label_storage_size.attr,
> &dev_attr_numa_node.attr,
> &dev_attr_trigger_poison_list.attr,
> + &dev_attr_inject_poison.attr,
> NULL,
> };
>
> @@ -175,6 +221,13 @@ static umode_t cxl_memdev_visible(struct kobject *kobj, struct attribute *a,
> to_cxl_memdev(dev)->cxlds->enabled_cmds))
> return 0;
> }
> + if (a == &dev_attr_inject_poison.attr) {
> + struct device *dev = kobj_to_dev(kobj);
> +
> + if (!test_bit(CXL_MEM_COMMAND_ID_INJECT_POISON,
> + to_cxl_memdev(dev)->cxlds->enabled_cmds))
> + return 0;
> + }
> return a->mode;
> }
>
> diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h
> index 19a9e545ac19..0d4c34be7335 100644
> --- a/drivers/cxl/cxlmem.h
> +++ b/drivers/cxl/cxlmem.h
> @@ -396,6 +396,9 @@ struct cxl_mbox_poison_payload_out {
> #define CXL_POISON_SOURCE_INJECTED 3
> #define CXL_POISON_SOURCE_VENDOR 7
>
> +/* Inject & Clear Poison CXL 3.0 Spec 8.2.9.8.4.2/3 */
> +#define CXL_POISON_INJECT_RESERVED GENMASK_ULL(5, 0)
> +
> /**
> * struct cxl_mem_command - Driver representation of a memory device command
> * @info: Command information as it exists for the UAPI
next prev parent reply other threads:[~2022-11-30 14:32 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-30 4:34 [PATCH 0/5] cxl: CXL Inject & Clear Poison alison.schofield
2022-11-30 4:34 ` [PATCH 1/5] cxl/memdev: Add support for the Inject Poison mailbox command alison.schofield
2022-11-30 14:31 ` Jonathan Cameron [this message]
2022-11-30 14:40 ` Jonathan Cameron
2022-12-01 16:42 ` Dave Jiang
2022-12-08 4:20 ` Alison Schofield
2022-12-01 17:26 ` Dave Jiang
2022-12-08 4:17 ` Alison Schofield
2022-12-04 22:04 ` Dan Williams
2022-12-08 4:16 ` Alison Schofield
2022-11-30 4:34 ` [PATCH 2/5] cxl/memdev: Add support for the Clear " alison.schofield
2022-11-30 14:43 ` Jonathan Cameron
2022-12-01 20:14 ` Alison Schofield
2022-12-01 17:54 ` Dave Jiang
2022-12-01 20:09 ` Alison Schofield
2022-11-30 4:34 ` [PATCH 3/5] tools/testing/cxl: Mock the Inject " alison.schofield
2022-11-30 14:58 ` Jonathan Cameron
2022-12-08 4:47 ` Alison Schofield
2022-12-08 14:53 ` Jonathan Cameron
2022-11-30 4:34 ` [PATCH 4/5] tools/testing/cxl: Mock the Clear " alison.schofield
2022-11-30 15:01 ` Jonathan Cameron
2022-11-30 4:34 ` [PATCH 5/5] tools/testing/cxl: Use injected poison for Get Poison List alison.schofield
2022-11-30 15:15 ` Jonathan Cameron
2022-12-08 4:30 ` Alison Schofield
2022-12-08 14:54 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221130143136.00003808@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=bwidawsk@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=vishal.l.verma@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.