On Thu, Aug 14, 2025 at 08:55:31AM -0500, Andrew Davis wrote: > This helps prevent mistakes like freeing out of order in cleanup functions > and forgetting to free on error paths. > > Signed-off-by: Andrew Davis <a...@ti.com> > --- > drivers/remoteproc/da8xx_remoteproc.c | 30 +++++++++++++-------------- > 1 file changed, 14 insertions(+), 16 deletions(-) > > diff --git a/drivers/remoteproc/da8xx_remoteproc.c > b/drivers/remoteproc/da8xx_remoteproc.c > index 47df21bea5254..58b4f05283d92 100644 > --- a/drivers/remoteproc/da8xx_remoteproc.c > +++ b/drivers/remoteproc/da8xx_remoteproc.c > @@ -233,6 +233,13 @@ static int da8xx_rproc_get_internal_memories(struct > platform_device *pdev, > return 0; > } > > +static void da8xx_rproc_mem_release(void *data) > +{ > + struct device *dev = data; > +
The check for dev->of_node from "free_mem" is missing. I can add it if you agree. > + of_reserved_mem_device_release(dev); > +} > + > static int da8xx_rproc_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -274,14 +281,13 @@ static int da8xx_rproc_probe(struct platform_device > *pdev) > ret = of_reserved_mem_device_init(dev); > if (ret) > return dev_err_probe(dev, ret, "device does not have > specific CMA pool\n"); > + devm_add_action_or_reset(&pdev->dev, da8xx_rproc_mem_release, > &pdev->dev); > } > > rproc = devm_rproc_alloc(dev, "dsp", &da8xx_rproc_ops, da8xx_fw_name, > sizeof(*drproc)); > - if (!rproc) { > - ret = -ENOMEM; > - goto free_mem; > - } > + if (!rproc) > + return -ENOMEM; > > /* error recovery is not supported at present */ > rproc->recovery_disabled = true; > @@ -294,7 +300,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > > ret = da8xx_rproc_get_internal_memories(pdev, drproc); > if (ret) > - goto free_mem; > + return ret; > > platform_set_drvdata(pdev, rproc); > > @@ -304,7 +310,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > rproc); > if (ret) { > dev_err(dev, "devm_request_threaded_irq error: %d\n", ret); > - goto free_mem; > + return ret; > } > > /* > @@ -314,7 +320,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev) > */ > ret = reset_control_assert(dsp_reset); > if (ret) > - goto free_mem; > + return ret; > > drproc->chipsig = chipsig; > drproc->bootreg = bootreg; > @@ -325,22 +331,16 @@ static int da8xx_rproc_probe(struct platform_device > *pdev) > ret = rproc_add(rproc); > if (ret) { > dev_err(dev, "rproc_add failed: %d\n", ret); > - goto free_mem; > + return ret; > } > > return 0; > - > -free_mem: > - if (dev->of_node) > - of_reserved_mem_device_release(dev); > - return ret; > } > > static void da8xx_rproc_remove(struct platform_device *pdev) > { > struct rproc *rproc = platform_get_drvdata(pdev); > struct da8xx_rproc *drproc = rproc->priv; > - struct device *dev = &pdev->dev; > > /* > * The devm subsystem might end up releasing things before > @@ -350,8 +350,6 @@ static void da8xx_rproc_remove(struct platform_device > *pdev) > disable_irq(drproc->irq); > > rproc_del(rproc); > - if (dev->of_node) > - of_reserved_mem_device_release(dev); > } > > static const struct of_device_id davinci_rproc_of_match[] __maybe_unused = { > -- > 2.39.2 >