Message ID | 20250403231339.23708-8-zaidal@os.amperecomputing.com |
---|---|
State | New |
Headers | show |
Series | Enable EINJv2 Support | expand |
On Thu, 3 Apr 2025 16:13:37 -0700 Zaid Alali <zaidal@os.amperecomputing.com> wrote: > Create a debugfs blob file to be used for reading the user > input for the component array. EINJv2 enables users to inject > errors to multiple components/devices at the same time using > component array. > > Signed-off-by: Zaid Alali <zaidal@os.amperecomputing.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Hmm. Maybe you didn't get my emails?
Zaid Alali wrote: > Create a debugfs blob file to be used for reading the user > input for the component array. EINJv2 enables users to inject > errors to multiple components/devices at the same time using > component array. > > Signed-off-by: Zaid Alali <zaidal@os.amperecomputing.com> [snip] > @@ -890,6 +893,17 @@ static int __init einj_probe(struct platform_device *pdev) > &error_param4); > debugfs_create_x32("notrigger", S_IRUSR | S_IWUSR, > einj_debug_dir, ¬rigger); > + if (available_error_type & ACPI65_EINJV2_SUPP) { > + user_input = kzalloc(COMP_ARR_SIZE, GFP_KERNEL); > + if (!user_input) { > + rc = -ENOMEM; > + goto err_alloc; > + } > + einjv2_component_arr.data = user_input; > + einjv2_component_arr.size = COMP_ARR_SIZE; > + debugfs_create_blob("einjv2_component_array", S_IRUSR | S_IWUSR, > + einj_debug_dir, &einjv2_component_arr); > + } > } > > if (vendor_dev[0]) { > @@ -909,6 +923,8 @@ static int __init einj_probe(struct platform_device *pdev) > > return 0; > > +err_alloc: > + apei_exec_post_unmap_gars(&ctx); The addition of an unmap call without a corresponding map call threw me. I see that this is needed in this flow. Why not attempt the kzalloc() right off in the function? This avoids the extra goto and all the unwind path. Like: diff --git a/drivers/acpi/apei/einj-core.c b/drivers/acpi/apei/einj-core.c index 04731a5b01fa..2993e0eb4f81 100644 --- a/drivers/acpi/apei/einj-core.c +++ b/drivers/acpi/apei/einj-core.c @@ -771,6 +771,10 @@ static int __init einj_probe(struct platform_device *pdev) return -EINVAL; } + user_input = kzalloc(COMP_ARR_SIZE, GFP_KERNEL); + if (!user_input) + return -ENOMEM; + rc = einj_check_table(einj_tab); if (rc) { pr_warn(FW_BUG "Invalid EINJ table.\n"); Or, perhaps better, just disable einjv2 if the alloc fails and not fail the probe? Ira [snip]
diff --git a/drivers/acpi/apei/einj-core.c b/drivers/acpi/apei/einj-core.c index d1ddc82744c7..dd7626da360c 100644 --- a/drivers/acpi/apei/einj-core.c +++ b/drivers/acpi/apei/einj-core.c @@ -33,6 +33,7 @@ #define SLEEP_UNIT_MAX 5000 /* 5ms */ /* Firmware should respond within 1 seconds */ #define FIRMWARE_TIMEOUT (1 * USEC_PER_SEC) +#define COMP_ARR_SIZE 1024 #define ACPI65_EINJV2_SUPP BIT(30) #define ACPI5_VENDOR_BIT BIT(31) #define MEM_ERROR_MASK (ACPI_EINJ_MEMORY_CORRECTABLE | \ @@ -107,6 +108,8 @@ static struct debugfs_blob_wrapper vendor_blob; static struct debugfs_blob_wrapper vendor_errors; static char vendor_dev[64]; +static struct debugfs_blob_wrapper einjv2_component_arr; +static void *user_input; static u32 available_error_type; static u32 available_error_type_v2; @@ -890,6 +893,17 @@ static int __init einj_probe(struct platform_device *pdev) &error_param4); debugfs_create_x32("notrigger", S_IRUSR | S_IWUSR, einj_debug_dir, ¬rigger); + if (available_error_type & ACPI65_EINJV2_SUPP) { + user_input = kzalloc(COMP_ARR_SIZE, GFP_KERNEL); + if (!user_input) { + rc = -ENOMEM; + goto err_alloc; + } + einjv2_component_arr.data = user_input; + einjv2_component_arr.size = COMP_ARR_SIZE; + debugfs_create_blob("einjv2_component_array", S_IRUSR | S_IWUSR, + einj_debug_dir, &einjv2_component_arr); + } } if (vendor_dev[0]) { @@ -909,6 +923,8 @@ static int __init einj_probe(struct platform_device *pdev) return 0; +err_alloc: + apei_exec_post_unmap_gars(&ctx); err_release: apei_resources_release(&einj_resources); err_fini: @@ -933,6 +949,7 @@ static void __exit einj_remove(struct platform_device *pdev) if (vendor_errors.size) acpi_os_unmap_memory(vendor_errors.data, vendor_errors.size); } + kfree(user_input); einj_exec_ctx_init(&ctx); apei_exec_post_unmap_gars(&ctx); apei_resources_release(&einj_resources);
Create a debugfs blob file to be used for reading the user input for the component array. EINJv2 enables users to inject errors to multiple components/devices at the same time using component array. Signed-off-by: Zaid Alali <zaidal@os.amperecomputing.com> --- drivers/acpi/apei/einj-core.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)