Hi Marek, Tom, > Subject: [PATCH 1/4] clk: scmi: Bulk allocate all sub-driver instance > data
I just see this patchset was delegated to me in patchwork. But there is no scmi repo, could I use the u-boot-fsl-qoriq.git repo for managing the scmi patches? Thanks, Peng. > > Allocate all sub-driver instance data at once. The amount of data that > have to be allocated is known up front, so is the size of the data, so > there is no need to call malloc() in a loop, mallocate all data at once. > > The upside is, less heap fragmentation and fewer malloc() calls overall, > and a faster boot time. > > The downside is, if some of the clock fail to register, then the clock > driver cannot free parts of the bulk allocated sub-driver instance data. > Such a failure can only occur if clk_register() were to fail, and if that > happens, the system has more significant problems. Worse, if a core > clock driver fails to probe, the system has even bigger problem. > > Signed-off-by: Marek Vasut <[email protected]> > --- > Cc: Alice Guo <[email protected]> > Cc: Patrice Chotard <[email protected]> > Cc: Patrick Delaunay <[email protected]> > Cc: Peng Fan <[email protected]> > Cc: Sean Anderson <[email protected]> > Cc: Tom Rini <[email protected]> > Cc: Valentin Caron <[email protected]> > Cc: Vinh Nguyen <[email protected]> > Cc: [email protected] > --- > drivers/clk/clk_scmi.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c index > f9e17c38cad..0b64c73a61d 100644 > --- a/drivers/clk/clk_scmi.c > +++ b/drivers/clk/clk_scmi.c > @@ -283,7 +283,7 @@ static ulong scmi_clk_set_rate(struct clk *clk, > ulong rate) > > static int scmi_clk_probe(struct udevice *dev) { > - struct clk_scmi *clk_scmi; > + struct clk_scmi *clk_scmi_bulk, *clk_scmi; > struct scmi_clock_priv *priv = dev_get_priv(dev); > size_t num_clocks, i; > int ret; > @@ -312,20 +312,23 @@ static int scmi_clk_probe(struct udevice > *dev) > return ret; > } > > + clk_scmi_bulk = kzalloc(num_clocks * sizeof(*clk_scmi), > GFP_KERNEL); > + if (!clk_scmi_bulk) > + return -ENOMEM; > + > for (i = 0; i < num_clocks; i++) { > char *clock_name; > u32 attributes; > > if (!scmi_clk_get_attibute(dev, i, &clock_name, > &attributes)) { > - clk_scmi = kzalloc(sizeof(*clk_scmi), > GFP_KERNEL); > - if (!clk_scmi || !clock_name) > + clk_scmi = clk_scmi_bulk + i; > + if (!clock_name) > ret = -ENOMEM; > else > ret = clk_register(&clk_scmi->clk, > dev->driver->name, > clock_name, dev- > >name); > > if (ret) { > - free(clk_scmi); > free(clock_name); > return ret; > } > -- > 2.51.0

