Commit 1e14ea90 authored by Shiju Jose's avatar Shiju Jose Committed by Borislav Petkov (AMD)
Browse files

EDAC: Initialize EDAC features sysfs attributes



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: f90b7381 ("EDAC: Add scrub control feature")
Fixes: bcbd069b ("EDAC: Add a Error Check Scrub control feature")
Fixes: 699ea521 ("EDAC: Add a memory repair control feature")
Reported-by: default avatarDave Jiang <dave.jiang@intel.com>
Suggested-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarShiju Jose <shiju.jose@huawei.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarJonathan Cameron <jonathan.cameron@huawei.com>
Link: https://lore.kernel.org/20250626101344.1726-1-shiju.jose@huawei.com
parent a3f30406
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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;
	}
+1 −0
Original line number Diff line number Diff line
@@ -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);