EDAC: Initialize EDAC features sysfs attributes
authorShiju Jose <shiju.jose@huawei.com>
Thu, 26 Jun 2025 10:13:44 +0000 (11:13 +0100)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 30 Jun 2025 08:57:24 +0000 (10:57 +0200)
Fix the lockdep splat caused by missing sysfs_attr_init() calls for the
recently added EDAC feature's sysfs attributes.

In lockdep_init_map_type(), the check for the lock-class key if
(!static_obj(key) && !is_dynamic_key(key)) causes the splat.

  Backtrace:
  RIP: 0010:lockdep_init_map_type
  Call Trace:
   __kernfs_create_file
  sysfs_add_file_mode_ns
  internal_create_group
  internal_create_groups
  device_add
  ? __init_waitqueue_head
  edac_dev_register
  devm_cxl_memdev_edac_register
  ? lock_acquire
  ? find_held_lock
  ? cxl_mem_probe
  ? cxl_mem_probe
  ? lockdep_hardirqs_on
  ? cxl_mem_probe
  cxl_mem_probe

  [ bp: Massage. ]

Fixes: f90b738166fe ("EDAC: Add scrub control feature")
Fixes: bcbd069b11b0 ("EDAC: Add a Error Check Scrub control feature")
Fixes: 699ea5219c4b ("EDAC: Add a memory repair control feature")
Reported-by: Dave Jiang <dave.jiang@intel.com>
Suggested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Link: https://lore.kernel.org/20250626101344.1726-1-shiju.jose@huawei.com
drivers/edac/ecs.c
drivers/edac/mem_repair.c
drivers/edac/scrub.c

index 1d51838a60c11117a939586316f05e494bd849a8..51c451c7f0f0b236b4a555c84fe04d61d2525e6b 100755 (executable)
@@ -170,8 +170,10 @@ static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group
                fru_ctx->dev_attr[ECS_RESET]            = EDAC_ECS_ATTR_WO(reset, fru);
                fru_ctx->dev_attr[ECS_THRESHOLD]        = EDAC_ECS_ATTR_RW(threshold, fru);
 
-               for (i = 0; i < ECS_MAX_ATTRS; i++)
+               for (i = 0; i < ECS_MAX_ATTRS; i++) {
+                       sysfs_attr_init(&fru_ctx->dev_attr[i].dev_attr.attr);
                        fru_ctx->ecs_attrs[i] = &fru_ctx->dev_attr[i].dev_attr.attr;
+               }
 
                sprintf(fru_ctx->name, "%s%d", EDAC_ECS_FRU_NAME, fru);
                group->name = fru_ctx->name;
index d1a8caa85369f3e76d250d0612bf62b7f0864eda..70a033a76233c7f960d4b780012516c8a7d80945 100755 (executable)
@@ -333,6 +333,7 @@ static int mem_repair_create_desc(struct device *dev,
        for (i = 0; i < MR_MAX_ATTRS; i++) {
                memcpy(&ctx->mem_repair_dev_attr[i],
                       &dev_attr[i], sizeof(dev_attr[i]));
+               sysfs_attr_init(&ctx->mem_repair_dev_attr[i].dev_attr.attr);
                ctx->mem_repair_attrs[i] =
                        &ctx->mem_repair_dev_attr[i].dev_attr.attr;
        }
index e421d3ebd959f4f9484e8ae8742d32555dcfccdd..f9d02af2fc3a205992708f2d545bf70943fcea1d 100755 (executable)
@@ -176,6 +176,7 @@ static int scrub_create_desc(struct device *scrub_dev,
        group = &scrub_ctx->group;
        for (i = 0; i < SCRUB_MAX_ATTRS; i++) {
                memcpy(&scrub_ctx->scrub_dev_attr[i], &dev_attr[i], sizeof(dev_attr[i]));
+               sysfs_attr_init(&scrub_ctx->scrub_dev_attr[i].dev_attr.attr);
                scrub_ctx->scrub_attrs[i] = &scrub_ctx->scrub_dev_attr[i].dev_attr.attr;
        }
        sprintf(scrub_ctx->name, "%s%d", "scrub", instance);