Hik On Sun, Mar 24, 2024 at 10:44 PM Stephen Boyd <sboyd@xxxxxxxxxx> wrote: > > Initialize this kref once we allocate memory for the struct clk_core so > that we can reuse the release function to free any memory associated > with the structure. This mostly consolidates code, but also clarifies > that the kref lifetime exists once the container structure (struct > clk_core) is allocated instead of leaving it in a half-baked state for > most of __clk_core_init(). > > Cc: Douglas Anderson <dianders@xxxxxxxxxxxx> > Signed-off-by: Stephen Boyd <sboyd@xxxxxxxxxx> > --- > drivers/clk/clk.c | 28 +++++++++++++--------------- > 1 file changed, 13 insertions(+), 15 deletions(-) > > diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c > index 9fc522c26de8..ee80b21f2824 100644 > --- a/drivers/clk/clk.c > +++ b/drivers/clk/clk.c > @@ -3959,8 +3959,6 @@ static int __clk_core_init(struct clk_core *core) > } > > clk_core_reparent_orphans_nolock(); > - > - kref_init(&core->ref); > out: > clk_pm_runtime_put(core); > unlock: > @@ -4189,6 +4187,16 @@ static void clk_core_free_parent_map(struct clk_core *core) > kfree(core->parents); > } > > +/* Free memory allocated for a struct clk_core */ > +static void __clk_release(struct kref *ref) > +{ > + struct clk_core *core = container_of(ref, struct clk_core, ref); > + > + clk_core_free_parent_map(core); > + kfree_const(core->name); > + kfree(core); > +} > + > static struct clk * > __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) > { > @@ -4209,6 +4217,8 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) > goto fail_out; > } > > + kref_init(&core->ref); > + > core->name = kstrdup_const(init->name, GFP_KERNEL); > if (!core->name) { > ret = -ENOMEM; > @@ -4263,12 +4273,10 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw) > hw->clk = NULL; > > fail_create_clk: > - clk_core_free_parent_map(core); > fail_parents: > fail_ops: > - kfree_const(core->name); > fail_name: > - kfree(core); > + kref_put(&core->ref, __clk_release); > fail_out: > return ERR_PTR(ret); If it were me, I probably would have: * Removed "fail_out" and turned the one "goto fail_out" to just return the error. * Consolidated the rest of the labels into a single "fail" label. That's definitely just a style opinion though, and IMO the patch is fine as-is and overall cleans up the code. Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>