RE: [PATCH] platform: mellanox: Fix a resource leak in an error handling path in mlxplat_probe()

From: Vadim Pasternak
Date: Thu Oct 05 2023 - 10:09:40 EST




> -----Original Message-----
> From: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> Sent: Wednesday, 4 October 2023 11:52
> To: Vadim Pasternak <vadimp@xxxxxxxxxx>
> Cc: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>; Hans de Goede
> <hdegoede@xxxxxxxxxx>; Mark Gross <markgross@xxxxxxxxxx>; Michael
> Shych <michaelsh@xxxxxxxxxx>; LKML <linux-kernel@xxxxxxxxxxxxxxx>; kernel-
> janitors@xxxxxxxxxxxxxxx; platform-driver-x86@xxxxxxxxxxxxxxx
> Subject: RE: [PATCH] platform: mellanox: Fix a resource leak in an error
> handling path in mlxplat_probe()
>
> On Tue, 3 Oct 2023, Vadim Pasternak wrote:
>
> > Hi Ilpo,
> > Thank you very much for review.
> >
> > > -----Original Message-----
> > > From: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> > > Sent: Tuesday, 3 October 2023 15:06
> > > To: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>
> > > Cc: Vadim Pasternak <vadimp@xxxxxxxxxx>; Hans de Goede
> > > <hdegoede@xxxxxxxxxx>; Mark Gross <markgross@xxxxxxxxxx>; Michael
> > > Shych <michaelsh@xxxxxxxxxx>; LKML <linux-kernel@xxxxxxxxxxxxxxx>;
> > > kernel- janitors@xxxxxxxxxxxxxxx;
> > > platform-driver-x86@xxxxxxxxxxxxxxx
> > > Subject: Re: [PATCH] platform: mellanox: Fix a resource leak in an
> > > error handling path in mlxplat_probe()
> > >
> > > On Sun, 1 Oct 2023, Christophe JAILLET wrote:
> > >
> > > > If an error occurs after a successful mlxplat_i2c_main_init(),
> > > > mlxplat_i2c_main_exit() should be called to free some resources.
> > > >
> > > > Add the missing call, as already done in the remove function.
> > > >
> > > > Fixes: 158cd8320776 ("platform: mellanox: Split logic in init and
> > > > exit
> > > > flow")
> > > > Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>
> > > > ---
> > > > This patch is based on comparison between functions called in the
> > > > remove function and the error handling path of the probe.
> > > >
> > > > For some reason, the way the code is written and function names
> > > > are puzzling to me.
> > >
> > > Indeed, pre/post are mixed up for init/exit variants which makes
> > > everything very confusing and the call to mlxplat_post_init() is
> > > buried deep into the call chain.
> > >
> > > These would seem better names for the init/deinit with proper pairing:
> > >
> > > - ..._logicdev_init/deinit for FPGA/CPLD init.
> > > - ..._mainbus_init/deinit
> > > - perhaps the rest could be just ..._platdevs_reg/unreg
> > >
> > > Those alone would make it much easier to follow.
> > >
> > > In addition,
> > > - mlxplat_i2c_mux_complition_notify() looks just useless call chain level
> > > and should be removed (it also has a typo in its name).
> > > - Maybe ..._platdev_reg() (currently mlxplat_post_init()) should be called
> > > directly from mainbus_init() or even from .probe() and not from the
> > > mux topo init.
> > >
> > > > So Review with care!
> > >
> > > It does not look complete as also mlxplat_i2c_main_init() lacks
> > > rollback it should do it mlxplat_i2c_mux_topology_init() failed.
> > >
> > > Since currently mlxplat_i2c_main_init() is what ultimately calls
> > > mlxplat_post_init() deep down in the call chain (unless the call to
> > > it gets moved out from there), it would be appropriate for
> > > mlxplat_i2c_main_exit() to do/call the cleanup. And neither
> > > .probe() nor
> > > .remove() should call mlxplat_pre_exit() directly in that case.
> > >
> > > So two alternative ways forward for the fix before all the renaming:
> > >
> > > 1) Move mlxplat_post_init() call out of its current place into .probe()
> > > and make the rollback path there to match that.
> > > 2) Do cleanup properly in mlxplat_i2c_main_init() and
> > > mlxplat_i2c_main_exit().
> > >
> > > I'd prefer 1) because it's much simpler to follow the init logic
> > > when the init components are not hidden deep into the call chain.
> > >
> >
> > I would prefer to keep mlxplat_i2c_mux_complition_notify() as separate
> > function. I am going to use it as a callback.
>
> It's okay for it to remain as long as the init/deinit pairs properly in the end.
>
> > I suggest I'll prepare the next patches:
> >
> > 1.
> > As a bugfix, fix provided by Christophe and additional cleanup in
> > mlxplat_i2c_main_init():
> >
> > @@ -6514,6 +6514,10 @@ static int mlxplat_i2c_main_init(struct
> mlxplat_priv *priv)
> > return 0;
> >
> > fail_mlxplat_i2c_mux_topology_init:
> > + if (priv->pdev_i2c) {
> > + platform_device_unregister(priv->pdev_i2c);
> > + priv->pdev_i2c = NULL;
> > + }
> > fail_platform_i2c_register:
> > fail_mlxplat_mlxcpld_verify_bus_topology:
> > return err;
> > @@ -6598,6 +6602,7 @@ static int mlxplat_probe(struct platform_device
> > *pdev)
> > fail_register_reboot_notifier:
> > fail_regcache_sync:
> > mlxplat_pre_exit(priv);
> > + mlxplat_i2c_main_exit(priv);
> > fail_mlxplat_i2c_main_init:
> > fail_regmap_write:
> >
> > 2.
> > Move mlxplat_pre_exit() inside mlxplat_i2c_main_exit()
>
> This can be and should be combined with step 1 (where .probe()'s rollback
> and .remove() would call it and not mlxplat_pre_exit() at all). It already makes
> the pairing okay on the logic level so only name pairing needs to be done after
> that.
>
> You can do separate patch both with Fixes tags since these are kinda
> independent issues.
>
> These 1+2 are what I suggested in 2).
>
> > 3.
> > Fix of ' complition' misspelling:
> > s/mlxplat_i2c_main_complition_notify/
> > mlxplat_i2c_main_completion_notify
> >
> > 4.
> >
> > Renaming:
> > mlxplat_pre_init()/mlxplat_post_exit() to
> > mlxplat_logicdev_init()/mlxplat_logicdev_exit()
> >
> > mlxplat_i2c_main_init()/mlxplat_i2c_main_exit() keep as is.
> >
> > mlxplat_post_init()/mlxplat_pre_exit() to
> > mlxplat_platdevs_init()/mlxplat_platdevs_exit()
> >
> > What do you think?
>
> Yes to 3 & 4.

Hi Ilpo,

Thank you very much for your inputs.

I sent one bugfix and two amendment patches.

I just wanted to note, that in case of some comments for these
patches, I'll be able to make modifications only after 15 October.

Thanks,
Vadim.

>
>
> --
> i.