All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] EDAC/features: Reduce stack usage in create_desc functions
@ 2025-06-30 16:20 shiju.jose
  2025-06-30 16:20 ` [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc() shiju.jose
  2025-06-30 16:20 ` [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc() shiju.jose
  0 siblings, 2 replies; 6+ messages in thread
From: shiju.jose @ 2025-06-30 16:20 UTC (permalink / raw)
  To: linux-edac, bp, tony.luck, arnd, mchehab, rric, dave.jiang,
	jonathan.cameron
  Cc: linuxarm, tanxiaofei, prime.zeng, shiju.jose

From: Shiju Jose <shiju.jose@huawei.com>

Constructing an array on the stack can exceed the warning limit for 
per-function stack usage. Reduce per-function stack usage by changing
to an actual attribute array allocated statically.

Shiju Jose (2):
  EDAC/scrub: Reduce stack usage in scrub_create_desc()
  EDAC/ecs: Reduce stack usage in ecs_create_desc()

 drivers/edac/ecs.c   | 29 +++++++++++------------------
 drivers/edac/scrub.c | 31 +++++++++++--------------------
 2 files changed, 22 insertions(+), 38 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc()
  2025-06-30 16:20 [PATCH 0/2] EDAC/features: Reduce stack usage in create_desc functions shiju.jose
@ 2025-06-30 16:20 ` shiju.jose
  2025-06-30 17:11   ` Jonathan Cameron
  2025-06-30 16:20 ` [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc() shiju.jose
  1 sibling, 1 reply; 6+ messages in thread
From: shiju.jose @ 2025-06-30 16:20 UTC (permalink / raw)
  To: linux-edac, bp, tony.luck, arnd, mchehab, rric, dave.jiang,
	jonathan.cameron
  Cc: linuxarm, tanxiaofei, prime.zeng, shiju.jose

From: Shiju Jose <shiju.jose@huawei.com>

Constructing an array on the stack can exceed the warning limit
for per-function stack usage.

Change this to have the actual attribute array allocated statically and
then add the instance number on the per-instance copy.

Fixes: f90b738166fe ("EDAC: Add scrub control feature")
Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
---
 drivers/edac/scrub.c | 31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/drivers/edac/scrub.c b/drivers/edac/scrub.c
index f9d02af2fc3a..850347d274e8 100755
--- a/drivers/edac/scrub.c
+++ b/drivers/edac/scrub.c
@@ -142,17 +142,14 @@ static umode_t scrub_attr_visible(struct kobject *kobj, struct attribute *a, int
 	return 0;
 }
 
-#define EDAC_SCRUB_ATTR_RO(_name, _instance)       \
-	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_RO(_name), \
-					.instance = _instance })
-
-#define EDAC_SCRUB_ATTR_WO(_name, _instance)       \
-	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_WO(_name), \
-					.instance = _instance })
-
-#define EDAC_SCRUB_ATTR_RW(_name, _instance)       \
-	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_RW(_name), \
-					.instance = _instance })
+static const struct device_attribute scrub_dev_attr[] = {
+	[SCRUB_ADDRESS]		    = __ATTR_RW(addr),
+	[SCRUB_SIZE]		    = __ATTR_RW(size),
+	[SCRUB_ENABLE_BACKGROUND]   = __ATTR_RW(enable_background),
+	[SCRUB_MIN_CYCLE_DURATION]  = __ATTR_RO(min_cycle_duration),
+	[SCRUB_MAX_CYCLE_DURATION]  = __ATTR_RO(max_cycle_duration),
+	[SCRUB_CUR_CYCLE_DURATION]  = __ATTR_RW(current_cycle_duration)
+};
 
 static int scrub_create_desc(struct device *scrub_dev,
 			     const struct attribute_group **attr_groups, u8 instance)
@@ -160,14 +157,6 @@ static int scrub_create_desc(struct device *scrub_dev,
 	struct edac_scrub_context *scrub_ctx;
 	struct attribute_group *group;
 	int i;
-	struct edac_scrub_dev_attr dev_attr[] = {
-		[SCRUB_ADDRESS] = EDAC_SCRUB_ATTR_RW(addr, instance),
-		[SCRUB_SIZE] = EDAC_SCRUB_ATTR_RW(size, instance),
-		[SCRUB_ENABLE_BACKGROUND] = EDAC_SCRUB_ATTR_RW(enable_background, instance),
-		[SCRUB_MIN_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RO(min_cycle_duration, instance),
-		[SCRUB_MAX_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RO(max_cycle_duration, instance),
-		[SCRUB_CUR_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RW(current_cycle_duration, instance)
-	};
 
 	scrub_ctx = devm_kzalloc(scrub_dev, sizeof(*scrub_ctx), GFP_KERNEL);
 	if (!scrub_ctx)
@@ -175,7 +164,9 @@ 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]));
+		scrub_ctx->scrub_dev_attr[i].dev_attr = scrub_dev_attr[i];
+		scrub_ctx->scrub_dev_attr[i].instance = instance;
+
 		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;
 	}
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc()
  2025-06-30 16:20 [PATCH 0/2] EDAC/features: Reduce stack usage in create_desc functions shiju.jose
  2025-06-30 16:20 ` [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc() shiju.jose
@ 2025-06-30 16:20 ` shiju.jose
  2025-06-30 17:15   ` Jonathan Cameron
  2025-07-01  3:27   ` kernel test robot
  1 sibling, 2 replies; 6+ messages in thread
From: shiju.jose @ 2025-06-30 16:20 UTC (permalink / raw)
  To: linux-edac, bp, tony.luck, arnd, mchehab, rric, dave.jiang,
	jonathan.cameron
  Cc: linuxarm, tanxiaofei, prime.zeng, shiju.jose

From: Shiju Jose <shiju.jose@huawei.com>

Reduce per-function stack usage by changing to an actual attribute array
allocated statically. Then, add the FRU ID number to the per-FRU copy.

In addition, rename the field 'dev_attr' in struct edac_ecs_fru_context to
'ecs_dev_attr' for better readability.

Fixes: bcbd069b11b0 ("EDAC: Add a Error Check Scrub control feature")
Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
---
 drivers/edac/ecs.c | 29 +++++++++++------------------
 1 file changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/edac/ecs.c b/drivers/edac/ecs.c
index 51c451c7f0f0..368e01db63d3 100755
--- a/drivers/edac/ecs.c
+++ b/drivers/edac/ecs.c
@@ -26,7 +26,7 @@ struct edac_ecs_dev_attr {
 
 struct edac_ecs_fru_context {
 	char name[EDAC_FEAT_NAME_LEN];
-	struct edac_ecs_dev_attr dev_attr[ECS_MAX_ATTRS];
+	struct edac_ecs_dev_attr ecs_dev_attr[ECS_MAX_ATTRS];
 	struct attribute *ecs_attrs[ECS_MAX_ATTRS + 1];
 	struct attribute_group group;
 };
@@ -131,17 +131,12 @@ static umode_t ecs_attr_visible(struct kobject *kobj, struct attribute *a, int a
 	return 0;
 }
 
-#define EDAC_ECS_ATTR_RO(_name, _fru_id)       \
-	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_RO(_name), \
-				     .fru_id = _fru_id })
-
-#define EDAC_ECS_ATTR_WO(_name, _fru_id)       \
-	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_WO(_name), \
-				     .fru_id = _fru_id })
-
-#define EDAC_ECS_ATTR_RW(_name, _fru_id)       \
-	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_RW(_name), \
-				     .fru_id = _fru_id })
+static const struct device_attribute ecs_dev_attr[] = {
+	[ECS_LOG_ENTRY_TYPE]	= __ATTR_RW(log_entry_type),
+	[ECS_MODE]		= __ATTR_RW(mode),
+	[ECS_RESET]		= __ATTR_WO(reset),
+	[ECS_THRESHOLD]		= __ATTR_RW(threshold)
+};
 
 static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group **attr_groups,
 			   u16 num_media_frus)
@@ -165,14 +160,12 @@ static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group
 		struct attribute_group *group = &fru_ctx->group;
 		int i;
 
-		fru_ctx->dev_attr[ECS_LOG_ENTRY_TYPE]	= EDAC_ECS_ATTR_RW(log_entry_type, fru);
-		fru_ctx->dev_attr[ECS_MODE]		= EDAC_ECS_ATTR_RW(mode, fru);
-		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++) {
+			fru_ctx->ecs_dev_attr[i].dev_attr = ecs_dev_attr[i];
+			fru_ctx->ecs_dev_attr[i].fru_id = fru;
+
 			sysfs_attr_init(&fru_ctx->dev_attr[i].dev_attr.attr);
-			fru_ctx->ecs_attrs[i] = &fru_ctx->dev_attr[i].dev_attr.attr;
+			fru_ctx->ecs_attrs[i] = &fru_ctx->ecs_dev_attr[i].dev_attr.attr;
 		}
 
 		sprintf(fru_ctx->name, "%s%d", EDAC_ECS_FRU_NAME, fru);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc()
  2025-06-30 16:20 ` [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc() shiju.jose
@ 2025-06-30 17:11   ` Jonathan Cameron
  0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2025-06-30 17:11 UTC (permalink / raw)
  To: shiju.jose
  Cc: linux-edac, bp, tony.luck, arnd, mchehab, rric, dave.jiang,
	linuxarm, tanxiaofei, prime.zeng

On Mon, 30 Jun 2025 17:20:33 +0100
<shiju.jose@huawei.com> wrote:

> From: Shiju Jose <shiju.jose@huawei.com>
> 
> Constructing an array on the stack can exceed the warning limit
> for per-function stack usage.
> 
> Change this to have the actual attribute array allocated statically and
> then add the instance number on the per-instance copy.
> 
> Fixes: f90b738166fe ("EDAC: Add scrub control feature")
> Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>

Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>

> ---
>  drivers/edac/scrub.c | 31 +++++++++++--------------------
>  1 file changed, 11 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/edac/scrub.c b/drivers/edac/scrub.c
> index f9d02af2fc3a..850347d274e8 100755
> --- a/drivers/edac/scrub.c
> +++ b/drivers/edac/scrub.c
> @@ -142,17 +142,14 @@ static umode_t scrub_attr_visible(struct kobject *kobj, struct attribute *a, int
>  	return 0;
>  }
>  
> -#define EDAC_SCRUB_ATTR_RO(_name, _instance)       \
> -	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_RO(_name), \
> -					.instance = _instance })
> -
> -#define EDAC_SCRUB_ATTR_WO(_name, _instance)       \
> -	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_WO(_name), \
> -					.instance = _instance })
> -
> -#define EDAC_SCRUB_ATTR_RW(_name, _instance)       \
> -	((struct edac_scrub_dev_attr) { .dev_attr = __ATTR_RW(_name), \
> -					.instance = _instance })
> +static const struct device_attribute scrub_dev_attr[] = {
> +	[SCRUB_ADDRESS]		    = __ATTR_RW(addr),
> +	[SCRUB_SIZE]		    = __ATTR_RW(size),
> +	[SCRUB_ENABLE_BACKGROUND]   = __ATTR_RW(enable_background),
> +	[SCRUB_MIN_CYCLE_DURATION]  = __ATTR_RO(min_cycle_duration),
> +	[SCRUB_MAX_CYCLE_DURATION]  = __ATTR_RO(max_cycle_duration),
> +	[SCRUB_CUR_CYCLE_DURATION]  = __ATTR_RW(current_cycle_duration)
> +};
>  
>  static int scrub_create_desc(struct device *scrub_dev,
>  			     const struct attribute_group **attr_groups, u8 instance)
> @@ -160,14 +157,6 @@ static int scrub_create_desc(struct device *scrub_dev,
>  	struct edac_scrub_context *scrub_ctx;
>  	struct attribute_group *group;
>  	int i;
> -	struct edac_scrub_dev_attr dev_attr[] = {
> -		[SCRUB_ADDRESS] = EDAC_SCRUB_ATTR_RW(addr, instance),
> -		[SCRUB_SIZE] = EDAC_SCRUB_ATTR_RW(size, instance),
> -		[SCRUB_ENABLE_BACKGROUND] = EDAC_SCRUB_ATTR_RW(enable_background, instance),
> -		[SCRUB_MIN_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RO(min_cycle_duration, instance),
> -		[SCRUB_MAX_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RO(max_cycle_duration, instance),
> -		[SCRUB_CUR_CYCLE_DURATION] = EDAC_SCRUB_ATTR_RW(current_cycle_duration, instance)
> -	};
>  
>  	scrub_ctx = devm_kzalloc(scrub_dev, sizeof(*scrub_ctx), GFP_KERNEL);
>  	if (!scrub_ctx)
> @@ -175,7 +164,9 @@ 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]));
> +		scrub_ctx->scrub_dev_attr[i].dev_attr = scrub_dev_attr[i];
> +		scrub_ctx->scrub_dev_attr[i].instance = instance;
> +
>  		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;
>  	}


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc()
  2025-06-30 16:20 ` [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc() shiju.jose
@ 2025-06-30 17:15   ` Jonathan Cameron
  2025-07-01  3:27   ` kernel test robot
  1 sibling, 0 replies; 6+ messages in thread
From: Jonathan Cameron @ 2025-06-30 17:15 UTC (permalink / raw)
  To: shiju.jose
  Cc: linux-edac, bp, tony.luck, arnd, mchehab, rric, dave.jiang,
	linuxarm, tanxiaofei, prime.zeng

On Mon, 30 Jun 2025 17:20:34 +0100
<shiju.jose@huawei.com> wrote:

> From: Shiju Jose <shiju.jose@huawei.com>
> 
> Reduce per-function stack usage by changing to an actual attribute array
> allocated statically. Then, add the FRU ID number to the per-FRU copy.
> 
> In addition, rename the field 'dev_attr' in struct edac_ecs_fru_context to
> 'ecs_dev_attr' for better readability.
> 
> Fixes: bcbd069b11b0 ("EDAC: Add a Error Check Scrub control feature")
> Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>
I'm not sure I'd have bothered with the rename, but it's harmless and a
small improvement, so fair enough.

Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>

> ---
>  drivers/edac/ecs.c | 29 +++++++++++------------------
>  1 file changed, 11 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/edac/ecs.c b/drivers/edac/ecs.c
> index 51c451c7f0f0..368e01db63d3 100755
> --- a/drivers/edac/ecs.c
> +++ b/drivers/edac/ecs.c
> @@ -26,7 +26,7 @@ struct edac_ecs_dev_attr {
>  
>  struct edac_ecs_fru_context {
>  	char name[EDAC_FEAT_NAME_LEN];
> -	struct edac_ecs_dev_attr dev_attr[ECS_MAX_ATTRS];
> +	struct edac_ecs_dev_attr ecs_dev_attr[ECS_MAX_ATTRS];
>  	struct attribute *ecs_attrs[ECS_MAX_ATTRS + 1];
>  	struct attribute_group group;
>  };
> @@ -131,17 +131,12 @@ static umode_t ecs_attr_visible(struct kobject *kobj, struct attribute *a, int a
>  	return 0;
>  }
>  
> -#define EDAC_ECS_ATTR_RO(_name, _fru_id)       \
> -	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_RO(_name), \
> -				     .fru_id = _fru_id })
> -
> -#define EDAC_ECS_ATTR_WO(_name, _fru_id)       \
> -	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_WO(_name), \
> -				     .fru_id = _fru_id })
> -
> -#define EDAC_ECS_ATTR_RW(_name, _fru_id)       \
> -	((struct edac_ecs_dev_attr) { .dev_attr = __ATTR_RW(_name), \
> -				     .fru_id = _fru_id })
> +static const struct device_attribute ecs_dev_attr[] = {
> +	[ECS_LOG_ENTRY_TYPE]	= __ATTR_RW(log_entry_type),
> +	[ECS_MODE]		= __ATTR_RW(mode),
> +	[ECS_RESET]		= __ATTR_WO(reset),
> +	[ECS_THRESHOLD]		= __ATTR_RW(threshold)
> +};
>  
>  static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group **attr_groups,
>  			   u16 num_media_frus)
> @@ -165,14 +160,12 @@ static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group
>  		struct attribute_group *group = &fru_ctx->group;
>  		int i;
>  
> -		fru_ctx->dev_attr[ECS_LOG_ENTRY_TYPE]	= EDAC_ECS_ATTR_RW(log_entry_type, fru);
> -		fru_ctx->dev_attr[ECS_MODE]		= EDAC_ECS_ATTR_RW(mode, fru);
> -		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++) {
> +			fru_ctx->ecs_dev_attr[i].dev_attr = ecs_dev_attr[i];
> +			fru_ctx->ecs_dev_attr[i].fru_id = fru;
> +
>  			sysfs_attr_init(&fru_ctx->dev_attr[i].dev_attr.attr);
> -			fru_ctx->ecs_attrs[i] = &fru_ctx->dev_attr[i].dev_attr.attr;
> +			fru_ctx->ecs_attrs[i] = &fru_ctx->ecs_dev_attr[i].dev_attr.attr;
>  		}
>  
>  		sprintf(fru_ctx->name, "%s%d", EDAC_ECS_FRU_NAME, fru);


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc()
  2025-06-30 16:20 ` [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc() shiju.jose
  2025-06-30 17:15   ` Jonathan Cameron
@ 2025-07-01  3:27   ` kernel test robot
  1 sibling, 0 replies; 6+ messages in thread
From: kernel test robot @ 2025-07-01  3:27 UTC (permalink / raw)
  To: shiju.jose, linux-edac, bp, tony.luck, arnd, mchehab, rric,
	dave.jiang, jonathan.cameron
  Cc: oe-kbuild-all, linuxarm, tanxiaofei, prime.zeng, shiju.jose

Hi,

kernel test robot noticed the following build errors:

[auto build test ERROR on ras/edac-for-next]
[cannot apply to linus/master v6.16-rc4 next-20250630]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/shiju-jose-huawei-com/EDAC-scrub-Reduce-stack-usage-in-scrub_create_desc/20250701-002641
base:   https://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next
patch link:    https://lore.kernel.org/r/20250630162034.1788-3-shiju.jose%40huawei.com
patch subject: [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc()
config: x86_64-randconfig-073-20250701 (https://download.01.org/0day-ci/archive/20250701/202507011111.3D1OQtAM-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14+deb12u1) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250701/202507011111.3D1OQtAM-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507011111.3D1OQtAM-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/linux/kobject.h:20,
                    from include/linux/energy_model.h:7,
                    from include/linux/device.h:16,
                    from include/linux/edac.h:16,
                    from drivers/edac/ecs.c:10:
   drivers/edac/ecs.c: In function 'ecs_create_desc':
>> drivers/edac/ecs.c:167:51: error: 'struct edac_ecs_fru_context' has no member named 'dev_attr'; did you mean 'ecs_dev_attr'?
     167 |                         sysfs_attr_init(&fru_ctx->dev_attr[i].dev_attr.attr);
         |                                                   ^~~~~~~~
   include/linux/sysfs.h:55:10: note: in definition of macro 'sysfs_attr_init'
      55 |         (attr)->key = &__key;                           \
         |          ^~~~


vim +167 drivers/edac/ecs.c

bcbd069b11b024 Shiju Jose 2025-02-12  @10  #include <linux/edac.h>
bcbd069b11b024 Shiju Jose 2025-02-12   11  
bcbd069b11b024 Shiju Jose 2025-02-12   12  #define EDAC_ECS_FRU_NAME "ecs_fru"
bcbd069b11b024 Shiju Jose 2025-02-12   13  
bcbd069b11b024 Shiju Jose 2025-02-12   14  enum edac_ecs_attributes {
bcbd069b11b024 Shiju Jose 2025-02-12   15  	ECS_LOG_ENTRY_TYPE,
bcbd069b11b024 Shiju Jose 2025-02-12   16  	ECS_MODE,
bcbd069b11b024 Shiju Jose 2025-02-12   17  	ECS_RESET,
bcbd069b11b024 Shiju Jose 2025-02-12   18  	ECS_THRESHOLD,
bcbd069b11b024 Shiju Jose 2025-02-12   19  	ECS_MAX_ATTRS
bcbd069b11b024 Shiju Jose 2025-02-12   20  };
bcbd069b11b024 Shiju Jose 2025-02-12   21  
bcbd069b11b024 Shiju Jose 2025-02-12   22  struct edac_ecs_dev_attr {
bcbd069b11b024 Shiju Jose 2025-02-12   23  	struct device_attribute dev_attr;
bcbd069b11b024 Shiju Jose 2025-02-12   24  	int fru_id;
bcbd069b11b024 Shiju Jose 2025-02-12   25  };
bcbd069b11b024 Shiju Jose 2025-02-12   26  
bcbd069b11b024 Shiju Jose 2025-02-12   27  struct edac_ecs_fru_context {
bcbd069b11b024 Shiju Jose 2025-02-12   28  	char name[EDAC_FEAT_NAME_LEN];
df1b3160633d4f Shiju Jose 2025-06-30   29  	struct edac_ecs_dev_attr ecs_dev_attr[ECS_MAX_ATTRS];
bcbd069b11b024 Shiju Jose 2025-02-12   30  	struct attribute *ecs_attrs[ECS_MAX_ATTRS + 1];
bcbd069b11b024 Shiju Jose 2025-02-12   31  	struct attribute_group group;
bcbd069b11b024 Shiju Jose 2025-02-12   32  };
bcbd069b11b024 Shiju Jose 2025-02-12   33  
bcbd069b11b024 Shiju Jose 2025-02-12   34  struct edac_ecs_context {
bcbd069b11b024 Shiju Jose 2025-02-12   35  	u16 num_media_frus;
bcbd069b11b024 Shiju Jose 2025-02-12   36  	struct edac_ecs_fru_context *fru_ctxs;
bcbd069b11b024 Shiju Jose 2025-02-12   37  };
bcbd069b11b024 Shiju Jose 2025-02-12   38  
bcbd069b11b024 Shiju Jose 2025-02-12   39  #define TO_ECS_DEV_ATTR(_dev_attr)	\
bcbd069b11b024 Shiju Jose 2025-02-12   40  	container_of(_dev_attr, struct edac_ecs_dev_attr, dev_attr)
bcbd069b11b024 Shiju Jose 2025-02-12   41  
bcbd069b11b024 Shiju Jose 2025-02-12   42  #define EDAC_ECS_ATTR_SHOW(attrib, cb, type, format)				\
bcbd069b11b024 Shiju Jose 2025-02-12   43  static ssize_t attrib##_show(struct device *ras_feat_dev,			\
bcbd069b11b024 Shiju Jose 2025-02-12   44  			     struct device_attribute *attr, char *buf)		\
bcbd069b11b024 Shiju Jose 2025-02-12   45  {										\
bcbd069b11b024 Shiju Jose 2025-02-12   46  	struct edac_ecs_dev_attr *dev_attr = TO_ECS_DEV_ATTR(attr);		\
bcbd069b11b024 Shiju Jose 2025-02-12   47  	struct edac_dev_feat_ctx *ctx = dev_get_drvdata(ras_feat_dev);		\
bcbd069b11b024 Shiju Jose 2025-02-12   48  	const struct edac_ecs_ops *ops = ctx->ecs.ecs_ops;			\
bcbd069b11b024 Shiju Jose 2025-02-12   49  	type data;								\
bcbd069b11b024 Shiju Jose 2025-02-12   50  	int ret;								\
bcbd069b11b024 Shiju Jose 2025-02-12   51  										\
bcbd069b11b024 Shiju Jose 2025-02-12   52  	ret = ops->cb(ras_feat_dev->parent, ctx->ecs.private,			\
bcbd069b11b024 Shiju Jose 2025-02-12   53  		      dev_attr->fru_id, &data);					\
bcbd069b11b024 Shiju Jose 2025-02-12   54  	if (ret)								\
bcbd069b11b024 Shiju Jose 2025-02-12   55  		return ret;							\
bcbd069b11b024 Shiju Jose 2025-02-12   56  										\
bcbd069b11b024 Shiju Jose 2025-02-12   57  	return sysfs_emit(buf, format, data);					\
bcbd069b11b024 Shiju Jose 2025-02-12   58  }
bcbd069b11b024 Shiju Jose 2025-02-12   59  
bcbd069b11b024 Shiju Jose 2025-02-12   60  EDAC_ECS_ATTR_SHOW(log_entry_type, get_log_entry_type, u32, "%u\n")
bcbd069b11b024 Shiju Jose 2025-02-12   61  EDAC_ECS_ATTR_SHOW(mode, get_mode, u32, "%u\n")
bcbd069b11b024 Shiju Jose 2025-02-12   62  EDAC_ECS_ATTR_SHOW(threshold, get_threshold, u32, "%u\n")
bcbd069b11b024 Shiju Jose 2025-02-12   63  
bcbd069b11b024 Shiju Jose 2025-02-12   64  #define EDAC_ECS_ATTR_STORE(attrib, cb, type, conv_func)			\
bcbd069b11b024 Shiju Jose 2025-02-12   65  static ssize_t attrib##_store(struct device *ras_feat_dev,			\
bcbd069b11b024 Shiju Jose 2025-02-12   66  			      struct device_attribute *attr,			\
bcbd069b11b024 Shiju Jose 2025-02-12   67  			      const char *buf, size_t len)			\
bcbd069b11b024 Shiju Jose 2025-02-12   68  {										\
bcbd069b11b024 Shiju Jose 2025-02-12   69  	struct edac_ecs_dev_attr *dev_attr = TO_ECS_DEV_ATTR(attr);		\
bcbd069b11b024 Shiju Jose 2025-02-12   70  	struct edac_dev_feat_ctx *ctx = dev_get_drvdata(ras_feat_dev);		\
bcbd069b11b024 Shiju Jose 2025-02-12   71  	const struct edac_ecs_ops *ops = ctx->ecs.ecs_ops;			\
bcbd069b11b024 Shiju Jose 2025-02-12   72  	type data;								\
bcbd069b11b024 Shiju Jose 2025-02-12   73  	int ret;								\
bcbd069b11b024 Shiju Jose 2025-02-12   74  										\
bcbd069b11b024 Shiju Jose 2025-02-12   75  	ret = conv_func(buf, 0, &data);						\
bcbd069b11b024 Shiju Jose 2025-02-12   76  	if (ret < 0)								\
bcbd069b11b024 Shiju Jose 2025-02-12   77  		return ret;							\
bcbd069b11b024 Shiju Jose 2025-02-12   78  										\
bcbd069b11b024 Shiju Jose 2025-02-12   79  	ret = ops->cb(ras_feat_dev->parent, ctx->ecs.private,			\
bcbd069b11b024 Shiju Jose 2025-02-12   80  		      dev_attr->fru_id, data);					\
bcbd069b11b024 Shiju Jose 2025-02-12   81  	if (ret)								\
bcbd069b11b024 Shiju Jose 2025-02-12   82  		return ret;							\
bcbd069b11b024 Shiju Jose 2025-02-12   83  										\
bcbd069b11b024 Shiju Jose 2025-02-12   84  	return len;								\
bcbd069b11b024 Shiju Jose 2025-02-12   85  }
bcbd069b11b024 Shiju Jose 2025-02-12   86  
bcbd069b11b024 Shiju Jose 2025-02-12   87  EDAC_ECS_ATTR_STORE(log_entry_type, set_log_entry_type, unsigned long, kstrtoul)
bcbd069b11b024 Shiju Jose 2025-02-12   88  EDAC_ECS_ATTR_STORE(mode, set_mode, unsigned long, kstrtoul)
bcbd069b11b024 Shiju Jose 2025-02-12   89  EDAC_ECS_ATTR_STORE(reset, reset, unsigned long, kstrtoul)
bcbd069b11b024 Shiju Jose 2025-02-12   90  EDAC_ECS_ATTR_STORE(threshold, set_threshold, unsigned long, kstrtoul)
bcbd069b11b024 Shiju Jose 2025-02-12   91  
bcbd069b11b024 Shiju Jose 2025-02-12   92  static umode_t ecs_attr_visible(struct kobject *kobj, struct attribute *a, int attr_id)
bcbd069b11b024 Shiju Jose 2025-02-12   93  {
bcbd069b11b024 Shiju Jose 2025-02-12   94  	struct device *ras_feat_dev = kobj_to_dev(kobj);
bcbd069b11b024 Shiju Jose 2025-02-12   95  	struct edac_dev_feat_ctx *ctx = dev_get_drvdata(ras_feat_dev);
bcbd069b11b024 Shiju Jose 2025-02-12   96  	const struct edac_ecs_ops *ops = ctx->ecs.ecs_ops;
bcbd069b11b024 Shiju Jose 2025-02-12   97  
bcbd069b11b024 Shiju Jose 2025-02-12   98  	switch (attr_id) {
bcbd069b11b024 Shiju Jose 2025-02-12   99  	case ECS_LOG_ENTRY_TYPE:
bcbd069b11b024 Shiju Jose 2025-02-12  100  		if (ops->get_log_entry_type)  {
bcbd069b11b024 Shiju Jose 2025-02-12  101  			if (ops->set_log_entry_type)
bcbd069b11b024 Shiju Jose 2025-02-12  102  				return a->mode;
bcbd069b11b024 Shiju Jose 2025-02-12  103  			else
bcbd069b11b024 Shiju Jose 2025-02-12  104  				return 0444;
bcbd069b11b024 Shiju Jose 2025-02-12  105  		}
bcbd069b11b024 Shiju Jose 2025-02-12  106  		break;
bcbd069b11b024 Shiju Jose 2025-02-12  107  	case ECS_MODE:
bcbd069b11b024 Shiju Jose 2025-02-12  108  		if (ops->get_mode) {
bcbd069b11b024 Shiju Jose 2025-02-12  109  			if (ops->set_mode)
bcbd069b11b024 Shiju Jose 2025-02-12  110  				return a->mode;
bcbd069b11b024 Shiju Jose 2025-02-12  111  			else
bcbd069b11b024 Shiju Jose 2025-02-12  112  				return 0444;
bcbd069b11b024 Shiju Jose 2025-02-12  113  		}
bcbd069b11b024 Shiju Jose 2025-02-12  114  		break;
bcbd069b11b024 Shiju Jose 2025-02-12  115  	case ECS_RESET:
bcbd069b11b024 Shiju Jose 2025-02-12  116  		if (ops->reset)
bcbd069b11b024 Shiju Jose 2025-02-12  117  			return a->mode;
bcbd069b11b024 Shiju Jose 2025-02-12  118  		break;
bcbd069b11b024 Shiju Jose 2025-02-12  119  	case ECS_THRESHOLD:
bcbd069b11b024 Shiju Jose 2025-02-12  120  		if (ops->get_threshold) {
bcbd069b11b024 Shiju Jose 2025-02-12  121  			if (ops->set_threshold)
bcbd069b11b024 Shiju Jose 2025-02-12  122  				return a->mode;
bcbd069b11b024 Shiju Jose 2025-02-12  123  			else
bcbd069b11b024 Shiju Jose 2025-02-12  124  				return 0444;
bcbd069b11b024 Shiju Jose 2025-02-12  125  		}
bcbd069b11b024 Shiju Jose 2025-02-12  126  		break;
bcbd069b11b024 Shiju Jose 2025-02-12  127  	default:
bcbd069b11b024 Shiju Jose 2025-02-12  128  		break;
bcbd069b11b024 Shiju Jose 2025-02-12  129  	}
bcbd069b11b024 Shiju Jose 2025-02-12  130  
bcbd069b11b024 Shiju Jose 2025-02-12  131  	return 0;
bcbd069b11b024 Shiju Jose 2025-02-12  132  }
bcbd069b11b024 Shiju Jose 2025-02-12  133  
df1b3160633d4f Shiju Jose 2025-06-30  134  static const struct device_attribute ecs_dev_attr[] = {
df1b3160633d4f Shiju Jose 2025-06-30  135  	[ECS_LOG_ENTRY_TYPE]	= __ATTR_RW(log_entry_type),
df1b3160633d4f Shiju Jose 2025-06-30  136  	[ECS_MODE]		= __ATTR_RW(mode),
df1b3160633d4f Shiju Jose 2025-06-30  137  	[ECS_RESET]		= __ATTR_WO(reset),
df1b3160633d4f Shiju Jose 2025-06-30  138  	[ECS_THRESHOLD]		= __ATTR_RW(threshold)
df1b3160633d4f Shiju Jose 2025-06-30  139  };
bcbd069b11b024 Shiju Jose 2025-02-12  140  
bcbd069b11b024 Shiju Jose 2025-02-12  141  static int ecs_create_desc(struct device *ecs_dev, const struct attribute_group **attr_groups,
bcbd069b11b024 Shiju Jose 2025-02-12  142  			   u16 num_media_frus)
bcbd069b11b024 Shiju Jose 2025-02-12  143  {
bcbd069b11b024 Shiju Jose 2025-02-12  144  	struct edac_ecs_context *ecs_ctx;
bcbd069b11b024 Shiju Jose 2025-02-12  145  	u32 fru;
bcbd069b11b024 Shiju Jose 2025-02-12  146  
bcbd069b11b024 Shiju Jose 2025-02-12  147  	ecs_ctx = devm_kzalloc(ecs_dev, sizeof(*ecs_ctx), GFP_KERNEL);
bcbd069b11b024 Shiju Jose 2025-02-12  148  	if (!ecs_ctx)
bcbd069b11b024 Shiju Jose 2025-02-12  149  		return -ENOMEM;
bcbd069b11b024 Shiju Jose 2025-02-12  150  
bcbd069b11b024 Shiju Jose 2025-02-12  151  	ecs_ctx->num_media_frus = num_media_frus;
bcbd069b11b024 Shiju Jose 2025-02-12  152  	ecs_ctx->fru_ctxs = devm_kcalloc(ecs_dev, num_media_frus,
bcbd069b11b024 Shiju Jose 2025-02-12  153  					 sizeof(*ecs_ctx->fru_ctxs),
bcbd069b11b024 Shiju Jose 2025-02-12  154  					 GFP_KERNEL);
bcbd069b11b024 Shiju Jose 2025-02-12  155  	if (!ecs_ctx->fru_ctxs)
bcbd069b11b024 Shiju Jose 2025-02-12  156  		return -ENOMEM;
bcbd069b11b024 Shiju Jose 2025-02-12  157  
bcbd069b11b024 Shiju Jose 2025-02-12  158  	for (fru = 0; fru < num_media_frus; fru++) {
bcbd069b11b024 Shiju Jose 2025-02-12  159  		struct edac_ecs_fru_context *fru_ctx = &ecs_ctx->fru_ctxs[fru];
bcbd069b11b024 Shiju Jose 2025-02-12  160  		struct attribute_group *group = &fru_ctx->group;
bcbd069b11b024 Shiju Jose 2025-02-12  161  		int i;
bcbd069b11b024 Shiju Jose 2025-02-12  162  
1e14ea901dc8d9 Shiju Jose 2025-06-26  163  		for (i = 0; i < ECS_MAX_ATTRS; i++) {
df1b3160633d4f Shiju Jose 2025-06-30  164  			fru_ctx->ecs_dev_attr[i].dev_attr = ecs_dev_attr[i];
df1b3160633d4f Shiju Jose 2025-06-30  165  			fru_ctx->ecs_dev_attr[i].fru_id = fru;
df1b3160633d4f Shiju Jose 2025-06-30  166  
1e14ea901dc8d9 Shiju Jose 2025-06-26 @167  			sysfs_attr_init(&fru_ctx->dev_attr[i].dev_attr.attr);
df1b3160633d4f Shiju Jose 2025-06-30  168  			fru_ctx->ecs_attrs[i] = &fru_ctx->ecs_dev_attr[i].dev_attr.attr;
1e14ea901dc8d9 Shiju Jose 2025-06-26  169  		}
bcbd069b11b024 Shiju Jose 2025-02-12  170  
bcbd069b11b024 Shiju Jose 2025-02-12  171  		sprintf(fru_ctx->name, "%s%d", EDAC_ECS_FRU_NAME, fru);
bcbd069b11b024 Shiju Jose 2025-02-12  172  		group->name = fru_ctx->name;
bcbd069b11b024 Shiju Jose 2025-02-12  173  		group->attrs = fru_ctx->ecs_attrs;
bcbd069b11b024 Shiju Jose 2025-02-12  174  		group->is_visible  = ecs_attr_visible;
bcbd069b11b024 Shiju Jose 2025-02-12  175  
bcbd069b11b024 Shiju Jose 2025-02-12  176  		attr_groups[fru] = group;
bcbd069b11b024 Shiju Jose 2025-02-12  177  	}
bcbd069b11b024 Shiju Jose 2025-02-12  178  
bcbd069b11b024 Shiju Jose 2025-02-12  179  	return 0;
bcbd069b11b024 Shiju Jose 2025-02-12  180  }
bcbd069b11b024 Shiju Jose 2025-02-12  181  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-07-01  3:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-30 16:20 [PATCH 0/2] EDAC/features: Reduce stack usage in create_desc functions shiju.jose
2025-06-30 16:20 ` [PATCH 1/2] EDAC/scrub: Reduce stack usage in scrub_create_desc() shiju.jose
2025-06-30 17:11   ` Jonathan Cameron
2025-06-30 16:20 ` [PATCH 2/2] EDAC/ecs: Reduce stack usage in ecs_create_desc() shiju.jose
2025-06-30 17:15   ` Jonathan Cameron
2025-07-01  3:27   ` kernel test robot

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.