RE: [PATCH] EDAC: sb_edac: use kzalloc_flex
From: Zhuo, Qiuxu
Date: Thu Mar 12 2026 - 22:57:18 EST
> From: Luck, Tony <tony.luck@xxxxxxxxx>
> [...]
> Subject: RE: [PATCH] EDAC: sb_edac: use kzalloc_flex
>
> > > + sbridge_dev->n_devs = table->n_devs_per_imc;
> > >
> > > Do you need this? I thought that kzalloc_flex() filled in the __counted_by
> field of the structure for you.
> > kzalloc_flex is just a macro over kzalloc(struct_size()). It does not
> > do automatic __counted_by, which makes no sense.
>
> It is a fancy macro. But may be complier version dependent whether the
> count is filled in.
Yes, " __builtin_counted_by_ref" needs gcc >= 15. See comments [1].
My gcc is v13.3 on Ubuntu 24.04, and I verified that "sbridge_dev->n_devs" was NOT filled in automatically [2].
For safety, we still need to fill in the count field explicitly.
[1] https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/compiler_types.h#n550
[2] --- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -778,7 +778,8 @@ static struct sbridge_dev *alloc_sbridge_dev(int seg, u8 bus, enum domain dom,
sbridge_dev->seg = seg;
sbridge_dev->bus = bus;
sbridge_dev->dom = dom;
- sbridge_dev->n_devs = table->n_devs_per_imc;
+ //sbridge_dev->n_devs = table->n_devs_per_imc;
+ pr_info("sbridge_dev->n_devs = %d, table->n_devs_per_imc = %d\n", sbridge_dev->n_devs, table->n_devs_per_imc);
Testing result log:
[ 1640.072460] EDAC DEBUG: sbridge_init:
[ 1640.072474] EDAC sbridge: Seeking for: PCI ID 8086:3ca0
[ 1640.072505] sbridge_dev->n_devs = 0, table->n_devs_per_imc = 11 <------------------
[ 1640.072511] EDAC DEBUG: sbridge_get_onedevice: Detected 8086:3ca0
[ 1640.072515] EDAC sbridge: Seeking for: PCI ID 8086:3ca0
[ 1640.072530] sbridge_dev->n_devs = 0, table->n_devs_per_imc = 11 <------------------
...
Failed to load the sb_edac driver.