summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMarek Vasut <[email protected]>2025-11-09 02:35:06 +0100
committerPeng Fan <[email protected]>2025-11-10 20:57:46 +0800
commitef52f697f281a88f5fa63608d50838b197cc4e9d (patch)
tree7eb4396e07b0f45482d1c8dc5a20d7b637705013 /drivers
parent66cb830291b78389eb995960ee5e1460aedd7447 (diff)
clk: scmi: Bulk allocate all sub-driver instance data
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. Reviewed-by: Peng Fan <[email protected]> Signed-off-by: Marek Vasut <[email protected]> Signed-off-by: Peng Fan <[email protected]>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk_scmi.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/clk/clk_scmi.c b/drivers/clk/clk_scmi.c
index 37e349b9c78..548bbfe14de 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;
}