From: Rosen Penev Date: Fri, 13 Mar 2026 21:56:37 +0000 (-0700) Subject: EDAC/sb: Use kzalloc_flex() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f42f3076dd9d2cd1bde6abc44e45478fad8a1a54;p=thirdparty%2Flinux.git EDAC/sb: Use kzalloc_flex() Simplifies allocations by using a flexible array member in this struct. Add __counted_by to get extra runtime analysis. Move counting variable assignment immediately after allocation as required by __counted_by. Signed-off-by: Rosen Penev Signed-off-by: Tony Luck Reviewed-by: Qiuxu Zhuo Link: https://patch.msgid.link/20260313215637.6371-1-rosenp@gmail.com --- diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 09d4e816404b8..7b282dfd093f2 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@ -364,11 +364,11 @@ struct sbridge_dev { int seg; u8 bus, mc; u8 node_id, source_id; - struct pci_dev **pdev; enum domain dom; int n_devs; int i_devs; struct mem_ctl_info *mci; + struct pci_dev *pdev[] __counted_by(n_devs); }; struct knl_pvt { @@ -771,21 +771,14 @@ static struct sbridge_dev *alloc_sbridge_dev(int seg, u8 bus, enum domain dom, { struct sbridge_dev *sbridge_dev; - sbridge_dev = kzalloc_obj(*sbridge_dev); + sbridge_dev = kzalloc_flex(*sbridge_dev, pdev, table->n_devs_per_imc); if (!sbridge_dev) return NULL; - sbridge_dev->pdev = kzalloc_objs(*sbridge_dev->pdev, - table->n_devs_per_imc); - if (!sbridge_dev->pdev) { - kfree(sbridge_dev); - return NULL; - } - + sbridge_dev->n_devs = table->n_devs_per_imc; sbridge_dev->seg = seg; sbridge_dev->bus = bus; sbridge_dev->dom = dom; - sbridge_dev->n_devs = table->n_devs_per_imc; list_add_tail(&sbridge_dev->list, &sbridge_edac_list); return sbridge_dev; @@ -794,7 +787,6 @@ static struct sbridge_dev *alloc_sbridge_dev(int seg, u8 bus, enum domain dom, static void free_sbridge_dev(struct sbridge_dev *sbridge_dev) { list_del(&sbridge_dev->list); - kfree(sbridge_dev->pdev); kfree(sbridge_dev); }