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

Reply via email to