Re: [ndctl PATCH v3 3/7] libcxl: Add poison injection support

Cheatham, Benjamin
2025-10-23T20:15:27Z

On 10/21/2025 6:44 PM, Dave Jiang wrote:
>
>
> On 10/21/25 11:31 AM, Ben Cheatham wrote:
>> Add a library API for clearing and injecting poison into a CXL memory
>> device through the CXL debugfs.
>>
>> This API will be used by the 'cxl-inject-error' and 'cxl-clear-error'
>> commands in later commits.
>>
>> Signed-off-by: Ben Cheatham <Benjamin.Cheatham@amd.com>
>> ---
>> cxl/lib/libcxl.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++
>> cxl/lib/libcxl.sym | 3 +++
>> cxl/libcxl.h | 3 +++
>> 3 files changed, 66 insertions(+)
>>
>> diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
>> index 9486b0f..9d4bd80 100644
>> --- a/cxl/lib/libcxl.c
>> +++ b/cxl/lib/libcxl.c
>> @@ -5019,3 +5019,63 @@ CXL_EXPORT struct cxl_cmd *cxl_cmd_new_set_alert_config(struct cxl_memdev *memde
>> {
>> return cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_SET_ALERT_CONFIG);
>> }
>> +
>> +CXL_EXPORT bool cxl_memdev_has_poison_injection(struct cxl_memdev *memdev)
>> +{
>> + struct cxl_ctx *ctx = memdev->ctx;
>> + size_t path_len;
>> + bool exists;
>> + char *path;
>> +
>> + if (!ctx->debugfs)
>> + return false;
>> +
>> + path_len = strlen(ctx->debugfs) + 100;
>> + path = calloc(path_len, sizeof(char));
>> + if (!path)
>> + return false;
>> +
>> + snprintf(path, path_len, "%s/cxl/%s/inject_poison", ctx->debugfs,
>> + cxl_memdev_get_devname(memdev));
>
> check return value
>
>> + exists = access(path, F_OK) == 0;
>
> While this works, it is more readable this way:
>
> exists = true;
> ...
> rc = access(path, F_OK);
> if (rc)
> exists = false;> +

Ok, I'll change it.

>> + free(path);
>> + return exists;
>> +}
>> +
>> +static int cxl_memdev_poison_action(struct cxl_memdev *memdev, size_t dpa,
>> + bool clear)
>> +{
>> + struct cxl_ctx *ctx = memdev->ctx;
>> + size_t path_len;
>> + char addr[32];
>> + char *path;
>> + int rc;
>> +
>> + if (!ctx->debugfs)
>> + return -ENOENT;
>> +
>> + path_len = strlen(ctx->debugfs) + 100;
>> + path = calloc(path_len, sizeof(char));
>> + if (!path)
>> + return -ENOMEM;
>> +
>> + snprintf(path, path_len, "%s/cxl/%s/%s", ctx->debugfs,
>> + cxl_memdev_get_devname(memdev),
>> + clear ? "clear_poison" : "inject_poison");
>> + snprintf(addr, 32, "0x%lx\n", dpa);
>
> check return values for both snprintf()
>

Will do!