* [PATCH 0/2] EDAC/device: simplify allocation @ 2026-04-30 22:00 Rosen Penev 2026-04-30 22:00 ` [PATCH 1/2] EDAC/device: simplify info allocation Rosen Penev 2026-04-30 22:00 ` [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Rosen Penev 0 siblings, 2 replies; 6+ messages in thread From: Rosen Penev @ 2026-04-30 22:00 UTC (permalink / raw) To: linux-edac Cc: Borislav Petkov, Tony Luck, Kees Cook, Gustavo A. R. Silva, open list, open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b Use a single allocation to remove a bunch of kfree calls. Rosen Penev (2): EDAC/device: simplify info allocation EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx drivers/edac/edac_device.c | 63 +++++++++++++------------------------- drivers/edac/edac_device.h | 4 +-- include/linux/edac.h | 2 +- 3 files changed, 24 insertions(+), 45 deletions(-) -- 2.54.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] EDAC/device: simplify info allocation 2026-04-30 22:00 [PATCH 0/2] EDAC/device: simplify allocation Rosen Penev @ 2026-04-30 22:00 ` Rosen Penev 2026-05-01 14:47 ` Zhuo, Qiuxu 2026-04-30 22:00 ` [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Rosen Penev 1 sibling, 1 reply; 6+ messages in thread From: Rosen Penev @ 2026-04-30 22:00 UTC (permalink / raw) To: linux-edac Cc: Borislav Petkov, Tony Luck, Kees Cook, Gustavo A. R. Silva, open list, open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b Use a flexible array member to combine info and instance allocations. Simplifies allocation slightly. Add __counted_by for extra runtime analysis. Move counting variable assignment to after allocation as kzalloc_flex already does with GCC >= 15. Signed-off-by: Rosen Penev <rosenp@gmail.com> --- drivers/edac/edac_device.c | 23 ++++++++--------------- drivers/edac/edac_device.h | 4 +--- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index cf0d3c2dfc04..9c21997a50e0 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c @@ -58,31 +58,25 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char *dev_name, unsigned nr_instance char *blk_name, unsigned nr_blocks, unsigned off_val, int device_index) { - struct edac_device_block *dev_blk, *blk_p, *blk; + struct edac_device_block *blk_p, *blk; struct edac_device_instance *dev_inst, *inst; struct edac_device_ctl_info *dev_ctl; unsigned instance, block; + size_t alloc_size; void *pvt; int err; edac_dbg(4, "instances=%d blocks=%d\n", nr_instances, nr_blocks); - dev_ctl = kzalloc_obj(struct edac_device_ctl_info); + alloc_size = struct_size(dev_ctl, instances, nr_instances); + alloc_size += sizeof(*dev_ctl->blocks) * nr_instances * nr_blocks; + dev_ctl = kzalloc(alloc_size, GFP_KERNEL); if (!dev_ctl) return NULL; - dev_inst = kzalloc_objs(struct edac_device_instance, nr_instances); - if (!dev_inst) - goto free; - - dev_ctl->instances = dev_inst; - - dev_blk = kzalloc_objs(struct edac_device_block, - nr_instances * nr_blocks); - if (!dev_blk) - goto free; + dev_ctl->nr_instances = nr_instances; - dev_ctl->blocks = dev_blk; + dev_ctl->blocks = (struct edac_device_block *)(dev_ctl->instances + nr_instances); if (pvt_sz) { pvt = kzalloc(pvt_sz, GFP_KERNEL); @@ -93,7 +87,6 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char *dev_name, unsigned nr_instance } dev_ctl->dev_idx = device_index; - dev_ctl->nr_instances = nr_instances; /* Default logging of CEs and UEs */ dev_ctl->log_ce = 1; @@ -107,7 +100,7 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char *dev_name, unsigned nr_instance inst = &dev_inst[instance]; inst->ctl = dev_ctl; inst->nr_blocks = nr_blocks; - blk_p = &dev_blk[instance * nr_blocks]; + blk_p = &dev_ctl->blocks[instance * nr_blocks]; inst->blocks = blk_p; /* name of this instance */ diff --git a/drivers/edac/edac_device.h b/drivers/edac/edac_device.h index 24c1921aa490..4562461a3e8f 100644 --- a/drivers/edac/edac_device.h +++ b/drivers/edac/edac_device.h @@ -203,7 +203,6 @@ struct edac_device_ctl_info { * and the array of those instances */ u32 nr_instances; - struct edac_device_instance *instances; struct edac_device_block *blocks; /* Event counters for the this whole EDAC Device */ @@ -213,6 +212,7 @@ struct edac_device_ctl_info { * device this structure controls */ struct kobject kobj; + struct edac_device_instance instances[] __counted_by(nr_instances); }; /* To get from the instance's wq to the beginning of the ctl structure */ @@ -341,8 +341,6 @@ static inline void __edac_device_free_ctl_info(struct edac_device_ctl_info *ci) { if (ci) { kfree(ci->pvt_info); - kfree(ci->blocks); - kfree(ci->instances); kfree(ci); } } -- 2.54.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [PATCH 1/2] EDAC/device: simplify info allocation 2026-04-30 22:00 ` [PATCH 1/2] EDAC/device: simplify info allocation Rosen Penev @ 2026-05-01 14:47 ` Zhuo, Qiuxu 0 siblings, 0 replies; 6+ messages in thread From: Zhuo, Qiuxu @ 2026-05-01 14:47 UTC (permalink / raw) To: Rosen Penev, linux-edac@vger.kernel.org Cc: Borislav Petkov, Luck, Tony, Kees Cook, Gustavo A. R. Silva, open list, open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by(_le|_be)?\b > From: Rosen Penev <rosenp@gmail.com> > Sent: Friday, May 1, 2026 6:01 AM > To: linux-edac@vger.kernel.org > Cc: Borislav Petkov <bp@alien8.de>; Luck, Tony <tony.luck@intel.com>; Kees > Cook <kees@kernel.org>; Gustavo A. R. Silva <gustavoars@kernel.org>; open > list <linux-kernel@vger.kernel.org>; open list:KERNEL HARDENING (not > covered by other areas):Keyword:\b__counted_by(_le|_be)?\b <linux- > hardening@vger.kernel.org> > Subject: [PATCH 1/2] EDAC/device: simplify info allocation > > Use a flexible array member to combine info and instance allocations. > Simplifies allocation slightly. > > Add __counted_by for extra runtime analysis. Move counting variable > assignment to after allocation as kzalloc_flex already does with GCC >= 15. I'm confused - I don't see kzalloc_flex()used in this patch. > > Signed-off-by: Rosen Penev <rosenp@gmail.com> > --- > drivers/edac/edac_device.c | 23 ++++++++--------------- > drivers/edac/edac_device.h | 4 +--- > 2 files changed, 9 insertions(+), 18 deletions(-) > > diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index > cf0d3c2dfc04..9c21997a50e0 100644 > --- a/drivers/edac/edac_device.c > +++ b/drivers/edac/edac_device.c > @@ -58,31 +58,25 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char > *dev_name, unsigned nr_instance > char *blk_name, unsigned nr_blocks, unsigned > off_val, > int device_index) > { > - struct edac_device_block *dev_blk, *blk_p, *blk; > + struct edac_device_block *blk_p, *blk; > struct edac_device_instance *dev_inst, *inst; > struct edac_device_ctl_info *dev_ctl; > unsigned instance, block; > + size_t alloc_size; > void *pvt; > int err; > > edac_dbg(4, "instances=%d blocks=%d\n", nr_instances, nr_blocks); > > - dev_ctl = kzalloc_obj(struct edac_device_ctl_info); > + alloc_size = struct_size(dev_ctl, instances, nr_instances); > + alloc_size += sizeof(*dev_ctl->blocks) * nr_instances * nr_blocks; > + dev_ctl = kzalloc(alloc_size, GFP_KERNEL); > if (!dev_ctl) > return NULL; > > - dev_inst = kzalloc_objs(struct edac_device_instance, nr_instances); > - if (!dev_inst) > - goto free; > - > - dev_ctl->instances = dev_inst; > - > - dev_blk = kzalloc_objs(struct edac_device_block, > - nr_instances * nr_blocks); > - if (!dev_blk) > - goto free; > + dev_ctl->nr_instances = nr_instances; > > - dev_ctl->blocks = dev_blk; > + dev_ctl->blocks = (struct edac_device_block *)(dev_ctl->instances + > +nr_instances); > 1. This assumes that the address 'dev_ctl->instances +nr_instances' is properly aligned for struct edac_device_block, but that is not guaranteed. 2. Using a flexible array member for a single structure member can be reasonable and easy to read. But this patch effectively turns two members into flexible arrays and requires manual address calculation for one of them (and there is alignment risk). This makes code less readable to me. I'd prefer old code, as it's easier to follow ownership and no pointer alignment risk. > if (pvt_sz) { > pvt = kzalloc(pvt_sz, GFP_KERNEL); > @@ -93,7 +87,6 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char > *dev_name, unsigned nr_instance > } > > dev_ctl->dev_idx = device_index; > - dev_ctl->nr_instances = nr_instances; > > /* Default logging of CEs and UEs */ > dev_ctl->log_ce = 1; > @@ -107,7 +100,7 @@ edac_device_alloc_ctl_info(unsigned pvt_sz, char > *dev_name, unsigned nr_instance > inst = &dev_inst[instance]; BUG: 'dev_inst' is used w/o initialization. [...] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx 2026-04-30 22:00 [PATCH 0/2] EDAC/device: simplify allocation Rosen Penev 2026-04-30 22:00 ` [PATCH 1/2] EDAC/device: simplify info allocation Rosen Penev @ 2026-04-30 22:00 ` Rosen Penev 2026-05-01 14:54 ` Zhuo, Qiuxu 2026-05-12 2:35 ` kernel test robot 1 sibling, 2 replies; 6+ messages in thread From: Rosen Penev @ 2026-04-30 22:00 UTC (permalink / raw) To: linux-edac Cc: Borislav Petkov, Tony Luck, Kees Cook, Gustavo A. R. Silva, open list, open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b Simplifies memory handling slightly by using a flexible array member. Signed-off-by: Rosen Penev <rosenp@gmail.com> --- drivers/edac/edac_device.c | 40 +++++++++++++------------------------- include/linux/edac.h | 2 +- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index 9c21997a50e0..a6c41ce68f13 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c @@ -569,8 +569,6 @@ static void edac_dev_release(struct device *dev) { struct edac_dev_feat_ctx *ctx = container_of(dev, struct edac_dev_feat_ctx, dev); - kfree(ctx->mem_repair); - kfree(ctx->scrub); kfree(ctx->dev.groups); kfree(ctx); } @@ -612,6 +610,7 @@ int edac_dev_register(struct device *parent, char *name, int attr_gcnt = 0; int ret = -ENOMEM; int scrub_cnt = 0; + size_t alloc_size; int feat; if (!parent || !name || !num_features || !ras_features) @@ -636,26 +635,18 @@ int edac_dev_register(struct device *parent, char *name, } } - ctx = kzalloc_obj(*ctx); + alloc_size = struct_size(ctx, scrub, scrub_cnt); + alloc_size += sizeof(*ctx->mem_repair) * mem_repair_cnt; + ctx = kzalloc(alloc_size, GFP_KERNEL); if (!ctx) return -ENOMEM; + ctx->mem_repair = ctx->scrub + scrub_cnt; + ras_attr_groups = kzalloc_objs(*ras_attr_groups, attr_gcnt + 1); if (!ras_attr_groups) goto ctx_free; - if (scrub_cnt) { - ctx->scrub = kzalloc_objs(*ctx->scrub, scrub_cnt); - if (!ctx->scrub) - goto groups_free; - } - - if (mem_repair_cnt) { - ctx->mem_repair = kzalloc_objs(*ctx->mem_repair, mem_repair_cnt); - if (!ctx->mem_repair) - goto data_mem_free; - } - attr_gcnt = 0; scrub_cnt = 0; mem_repair_cnt = 0; @@ -664,7 +655,7 @@ int edac_dev_register(struct device *parent, char *name, case RAS_FEAT_SCRUB: if (!ras_features->scrub_ops || scrub_cnt != ras_features->instance) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->scrub[scrub_cnt]; @@ -674,7 +665,7 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_scrub_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->instance); if (ret) - goto data_mem_free; + goto groups_free; scrub_cnt++; attr_gcnt++; @@ -682,7 +673,7 @@ int edac_dev_register(struct device *parent, char *name, case RAS_FEAT_ECS: if (!ras_features->ecs_ops) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->ecs; @@ -691,7 +682,7 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_ecs_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->ecs_info.num_media_frus); if (ret) - goto data_mem_free; + goto groups_free; attr_gcnt += ras_features->ecs_info.num_media_frus; break; @@ -699,7 +690,7 @@ int edac_dev_register(struct device *parent, char *name, if (!ras_features->mem_repair_ops || mem_repair_cnt != ras_features->instance) { ret = -EINVAL; - goto data_mem_free; + goto groups_free; } dev_data = &ctx->mem_repair[mem_repair_cnt]; @@ -709,14 +700,14 @@ int edac_dev_register(struct device *parent, char *name, ret = edac_mem_repair_get_desc(parent, &ras_attr_groups[attr_gcnt], ras_features->instance); if (ret) - goto data_mem_free; + goto groups_free; mem_repair_cnt++; attr_gcnt++; break; default: ret = -EINVAL; - goto data_mem_free; + goto groups_free; } } @@ -729,7 +720,7 @@ int edac_dev_register(struct device *parent, char *name, ret = dev_set_name(&ctx->dev, "%s", name); if (ret) - goto data_mem_free; + goto groups_free; ret = device_register(&ctx->dev); if (ret) { @@ -739,9 +730,6 @@ int edac_dev_register(struct device *parent, char *name, return devm_add_action_or_reset(parent, edac_dev_unreg, &ctx->dev); -data_mem_free: - kfree(ctx->mem_repair); - kfree(ctx->scrub); groups_free: kfree(ras_attr_groups); ctx_free: diff --git a/include/linux/edac.h b/include/linux/edac.h index 7a3c1c60dea7..b3ca9e3d0521 100644 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@ -864,9 +864,9 @@ struct edac_dev_data { struct edac_dev_feat_ctx { struct device dev; void *private; - struct edac_dev_data *scrub; struct edac_dev_data ecs; struct edac_dev_data *mem_repair; + struct edac_dev_data scrub[]; }; struct edac_dev_feature { -- 2.54.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx 2026-04-30 22:00 ` [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Rosen Penev @ 2026-05-01 14:54 ` Zhuo, Qiuxu 2026-05-12 2:35 ` kernel test robot 1 sibling, 0 replies; 6+ messages in thread From: Zhuo, Qiuxu @ 2026-05-01 14:54 UTC (permalink / raw) To: Rosen Penev, linux-edac@vger.kernel.org Cc: Borislav Petkov, Luck, Tony, Kees Cook, Gustavo A. R. Silva, open list, open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by(_le|_be)?\b > From: Rosen Penev <rosenp@gmail.com> > Sent: Friday, May 1, 2026 6:01 AM > To: linux-edac@vger.kernel.org > Cc: Borislav Petkov <bp@alien8.de>; Luck, Tony <tony.luck@intel.com>; Kees > Cook <kees@kernel.org>; Gustavo A. R. Silva <gustavoars@kernel.org>; open > list <linux-kernel@vger.kernel.org>; open list:KERNEL HARDENING (not > covered by other areas):Keyword:\b__counted_by(_le|_be)?\b <linux- > hardening@vger.kernel.org> > Subject: [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx > > Simplifies memory handling slightly by using a flexible array member. > > Signed-off-by: Rosen Penev <rosenp@gmail.com> > --- > drivers/edac/edac_device.c | 40 +++++++++++++------------------------- > include/linux/edac.h | 2 +- > 2 files changed, 15 insertions(+), 27 deletions(-) > > diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index > 9c21997a50e0..a6c41ce68f13 100644 > --- a/drivers/edac/edac_device.c > +++ b/drivers/edac/edac_device.c > @@ -569,8 +569,6 @@ static void edac_dev_release(struct device *dev) { > struct edac_dev_feat_ctx *ctx = container_of(dev, struct > edac_dev_feat_ctx, dev); > > - kfree(ctx->mem_repair); > - kfree(ctx->scrub); > kfree(ctx->dev.groups); > kfree(ctx); > } > @@ -612,6 +610,7 @@ int edac_dev_register(struct device *parent, char > *name, > int attr_gcnt = 0; > int ret = -ENOMEM; > int scrub_cnt = 0; > + size_t alloc_size; > int feat; > > if (!parent || !name || !num_features || !ras_features) @@ -636,26 > +635,18 @@ int edac_dev_register(struct device *parent, char *name, > } > } > > - ctx = kzalloc_obj(*ctx); > + alloc_size = struct_size(ctx, scrub, scrub_cnt); > + alloc_size += sizeof(*ctx->mem_repair) * mem_repair_cnt; > + ctx = kzalloc(alloc_size, GFP_KERNEL); > if (!ctx) > return -ENOMEM; > > + ctx->mem_repair = ctx->scrub + scrub_cnt; The same concerns about pointer alignment risk and code readability as in: https://lore.kernel.org/all/CY8PR11MB7134BF3800324EFA1B3172AA89322@CY8PR11MB7134.namprd11.prod.outlook.com/ -Qiuxu ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx 2026-04-30 22:00 ` [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Rosen Penev 2026-05-01 14:54 ` Zhuo, Qiuxu @ 2026-05-12 2:35 ` kernel test robot 1 sibling, 0 replies; 6+ messages in thread From: kernel test robot @ 2026-05-12 2:35 UTC (permalink / raw) To: Rosen Penev, linux-edac Hi Rosen, kernel test robot noticed the following build warnings: [auto build test WARNING on ras/edac-for-next] [also build test WARNING on kees/for-next/pstore kees/for-next/kspp linus/master v7.1-rc3 next-20260508] [cannot apply to bp/for-next] [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/Rosen-Penev/EDAC-device-simplify-info-allocation/20260501-182310 base: https://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next patch link: https://lore.kernel.org/r/20260430220046.72371-3-rosenp%40gmail.com patch subject: [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20260512/202605120409.SqaLYj28-lkp@intel.com/config) compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261) rustc: rustc 1.88.0 (6b00bc388 2025-06-23) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260512/202605120409.SqaLYj28-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/202605120409.SqaLYj28-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/edac/edac_device.c:100:11: warning: variable 'dev_inst' is uninitialized when used here [-Wuninitialized] 100 | inst = &dev_inst[instance]; | ^~~~~~~~ drivers/edac/edac_device.c:62:39: note: initialize the variable 'dev_inst' to silence this warning 62 | struct edac_device_instance *dev_inst, *inst; | ^ | = NULL 1 warning generated. vim +/dev_inst +100 drivers/edac/edac_device.c e27e3dac651771 Douglas Thompson 2007-07-19 52 0d24a49e88b563 Borislav Petkov 2022-03-08 53 /* 0d24a49e88b563 Borislav Petkov 2022-03-08 54 * @off_val: zero, 1, or other based offset 0d24a49e88b563 Borislav Petkov 2022-03-08 55 */ 0d24a49e88b563 Borislav Petkov 2022-03-08 56 struct edac_device_ctl_info * 0d24a49e88b563 Borislav Petkov 2022-03-08 57 edac_device_alloc_ctl_info(unsigned pvt_sz, char *dev_name, unsigned nr_instances, 0d24a49e88b563 Borislav Petkov 2022-03-08 58 char *blk_name, unsigned nr_blocks, unsigned off_val, 48bc8869c5ddb0 Jiri Slaby (SUSE 2024-02-13 59) int device_index) e27e3dac651771 Douglas Thompson 2007-07-19 60 { 3856ba23b1d621 Rosen Penev 2026-04-30 61 struct edac_device_block *blk_p, *blk; 0d24a49e88b563 Borislav Petkov 2022-03-08 62 struct edac_device_instance *dev_inst, *inst; 0d24a49e88b563 Borislav Petkov 2022-03-08 63 struct edac_device_ctl_info *dev_ctl; 48bc8869c5ddb0 Jiri Slaby (SUSE 2024-02-13 64) unsigned instance, block; 3856ba23b1d621 Rosen Penev 2026-04-30 65 size_t alloc_size; 9fb9ce392aae0c Borislav Petkov 2022-03-08 66 void *pvt; 1c3631ff1f805c Douglas Thompson 2007-07-19 67 int err; e27e3dac651771 Douglas Thompson 2007-07-19 68 956b9ba156dbfd Joe Perches 2012-04-29 69 edac_dbg(4, "instances=%d blocks=%d\n", nr_instances, nr_blocks); e27e3dac651771 Douglas Thompson 2007-07-19 70 3856ba23b1d621 Rosen Penev 2026-04-30 71 alloc_size = struct_size(dev_ctl, instances, nr_instances); 3856ba23b1d621 Rosen Penev 2026-04-30 72 alloc_size += sizeof(*dev_ctl->blocks) * nr_instances * nr_blocks; 3856ba23b1d621 Rosen Penev 2026-04-30 73 dev_ctl = kzalloc(alloc_size, GFP_KERNEL); 9fb9ce392aae0c Borislav Petkov 2022-03-08 74 if (!dev_ctl) 9fb9ce392aae0c Borislav Petkov 2022-03-08 75 return NULL; e27e3dac651771 Douglas Thompson 2007-07-19 76 3856ba23b1d621 Rosen Penev 2026-04-30 77 dev_ctl->nr_instances = nr_instances; e27e3dac651771 Douglas Thompson 2007-07-19 78 3856ba23b1d621 Rosen Penev 2026-04-30 79 dev_ctl->blocks = (struct edac_device_block *)(dev_ctl->instances + nr_instances); fd309a9d8e63e9 Douglas Thompson 2007-07-19 80 0d24a49e88b563 Borislav Petkov 2022-03-08 81 if (pvt_sz) { 0d24a49e88b563 Borislav Petkov 2022-03-08 82 pvt = kzalloc(pvt_sz, GFP_KERNEL); 9fb9ce392aae0c Borislav Petkov 2022-03-08 83 if (!pvt) 9fb9ce392aae0c Borislav Petkov 2022-03-08 84 goto free; 9fb9ce392aae0c Borislav Petkov 2022-03-08 85 9fb9ce392aae0c Borislav Petkov 2022-03-08 86 dev_ctl->pvt_info = pvt; 9fb9ce392aae0c Borislav Petkov 2022-03-08 87 } e27e3dac651771 Douglas Thompson 2007-07-19 88 d45e7823baf655 Doug Thompson 2007-07-19 89 dev_ctl->dev_idx = device_index; e27e3dac651771 Douglas Thompson 2007-07-19 90 56e61a9c5fe7b7 Doug Thompson 2008-02-07 91 /* Default logging of CEs and UEs */ 56e61a9c5fe7b7 Doug Thompson 2008-02-07 92 dev_ctl->log_ce = 1; 56e61a9c5fe7b7 Doug Thompson 2008-02-07 93 dev_ctl->log_ue = 1; 56e61a9c5fe7b7 Doug Thompson 2008-02-07 94 52490c8d07680a Douglas Thompson 2007-07-19 95 /* Name of this edac device */ 0d24a49e88b563 Borislav Petkov 2022-03-08 96 snprintf(dev_ctl->name, sizeof(dev_ctl->name),"%s", dev_name); e27e3dac651771 Douglas Thompson 2007-07-19 97 e27e3dac651771 Douglas Thompson 2007-07-19 98 /* Initialize every Instance */ e27e3dac651771 Douglas Thompson 2007-07-19 99 for (instance = 0; instance < nr_instances; instance++) { e27e3dac651771 Douglas Thompson 2007-07-19 @100 inst = &dev_inst[instance]; e27e3dac651771 Douglas Thompson 2007-07-19 101 inst->ctl = dev_ctl; e27e3dac651771 Douglas Thompson 2007-07-19 102 inst->nr_blocks = nr_blocks; 3856ba23b1d621 Rosen Penev 2026-04-30 103 blk_p = &dev_ctl->blocks[instance * nr_blocks]; e27e3dac651771 Douglas Thompson 2007-07-19 104 inst->blocks = blk_p; e27e3dac651771 Douglas Thompson 2007-07-19 105 e27e3dac651771 Douglas Thompson 2007-07-19 106 /* name of this instance */ 0d24a49e88b563 Borislav Petkov 2022-03-08 107 snprintf(inst->name, sizeof(inst->name), "%s%u", dev_name, instance); e27e3dac651771 Douglas Thompson 2007-07-19 108 e27e3dac651771 Douglas Thompson 2007-07-19 109 /* Initialize every block in each instance */ 079708b9173595 Douglas Thompson 2007-07-19 110 for (block = 0; block < nr_blocks; block++) { e27e3dac651771 Douglas Thompson 2007-07-19 111 blk = &blk_p[block]; e27e3dac651771 Douglas Thompson 2007-07-19 112 blk->instance = inst; e27e3dac651771 Douglas Thompson 2007-07-19 113 snprintf(blk->name, sizeof(blk->name), 0d24a49e88b563 Borislav Petkov 2022-03-08 114 "%s%d", blk_name, block + off_val); e27e3dac651771 Douglas Thompson 2007-07-19 115 956b9ba156dbfd Joe Perches 2012-04-29 116 edac_dbg(4, "instance=%d inst_p=%p block=#%d block_p=%p name='%s'\n", 956b9ba156dbfd Joe Perches 2012-04-29 117 instance, inst, block, blk, blk->name); e27e3dac651771 Douglas Thompson 2007-07-19 118 } e27e3dac651771 Douglas Thompson 2007-07-19 119 } e27e3dac651771 Douglas Thompson 2007-07-19 120 e27e3dac651771 Douglas Thompson 2007-07-19 121 /* Mark this instance as merely ALLOCATED */ e27e3dac651771 Douglas Thompson 2007-07-19 122 dev_ctl->op_state = OP_ALLOC; e27e3dac651771 Douglas Thompson 2007-07-19 123 1c3631ff1f805c Douglas Thompson 2007-07-19 124 /* 1c3631ff1f805c Douglas Thompson 2007-07-19 125 * Initialize the 'root' kobj for the edac_device controller 1c3631ff1f805c Douglas Thompson 2007-07-19 126 */ 1c3631ff1f805c Douglas Thompson 2007-07-19 127 err = edac_device_register_sysfs_main_kobj(dev_ctl); 9fb9ce392aae0c Borislav Petkov 2022-03-08 128 if (err) 9fb9ce392aae0c Borislav Petkov 2022-03-08 129 goto free; 1c3631ff1f805c Douglas Thompson 2007-07-19 130 1c3631ff1f805c Douglas Thompson 2007-07-19 131 /* at this point, the root kobj is valid, and in order to 1c3631ff1f805c Douglas Thompson 2007-07-19 132 * 'free' the object, then the function: 1c3631ff1f805c Douglas Thompson 2007-07-19 133 * edac_device_unregister_sysfs_main_kobj() must be called 1c3631ff1f805c Douglas Thompson 2007-07-19 134 * which will perform kobj unregistration and the actual free 1c3631ff1f805c Douglas Thompson 2007-07-19 135 * will occur during the kobject callback operation 1c3631ff1f805c Douglas Thompson 2007-07-19 136 */ 1c3631ff1f805c Douglas Thompson 2007-07-19 137 e27e3dac651771 Douglas Thompson 2007-07-19 138 return dev_ctl; 9fb9ce392aae0c Borislav Petkov 2022-03-08 139 9fb9ce392aae0c Borislav Petkov 2022-03-08 140 free: 9fb9ce392aae0c Borislav Petkov 2022-03-08 141 __edac_device_free_ctl_info(dev_ctl); 9fb9ce392aae0c Borislav Petkov 2022-03-08 142 9fb9ce392aae0c Borislav Petkov 2022-03-08 143 return NULL; e27e3dac651771 Douglas Thompson 2007-07-19 144 } e27e3dac651771 Douglas Thompson 2007-07-19 145 EXPORT_SYMBOL_GPL(edac_device_alloc_ctl_info); e27e3dac651771 Douglas Thompson 2007-07-19 146 -- 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:[~2026-05-12 2:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-30 22:00 [PATCH 0/2] EDAC/device: simplify allocation Rosen Penev 2026-04-30 22:00 ` [PATCH 1/2] EDAC/device: simplify info allocation Rosen Penev 2026-05-01 14:47 ` Zhuo, Qiuxu 2026-04-30 22:00 ` [PATCH 2/2] EDAC/device: 3 to 1 allocations in edac_dev_feat_ctx Rosen Penev 2026-05-01 14:54 ` Zhuo, Qiuxu 2026-05-12 2:35 ` kernel test robot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox