Simplifies allocations by using a flexible array member in this struct. Add __counted_by to get extra runtime analysis.
Signed-off-by: Rosen Penev <[email protected]> --- drivers/edac/sb_edac.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 09d4e816404b..7b282dfd093f 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); } -- 2.53.0

