RE: [PATCH 08/15] dmaengine: sh: rz-dmac: fix device leak on probe failure

Fabrizio Castro
2025-11-18T13:49:59Z

> From: Johan Hovold <johan@kernel.org>
> Sent: 17 November 2025 16:13
> To: Vinod Koul <vkoul@kernel.org>
> Cc: Ludovic Desroches <ludovic.desroches@microchip.com>; Viresh Kumar <vireshk@kernel.org>; Andy
> Shevchenko <andriy.shevchenko@linux.intel.com>; Vinicius Costa Gomes <vinicius.gomes@intel.com>; Dave
> Jiang <dave.jiang@intel.com>; Vladimir Zapolskiy <vz@mleia.com>; Piotr Wojtaszczyk
> <piotr.wojtaszczyk@timesys.com>; Amélie Delaunay <amelie.delaunay@foss.st.com>; Maxime Coquelin
> <mcoquelin.stm32@gmail.com>; Alexandre Torgue <alexandre.torgue@foss.st.com>; Peter Ujfalusi
> <peter.ujfalusi@gmail.com>; dmaengine@vger.kernel.org; linux-kernel@vger.kernel.org; Johan Hovold
> <johan@kernel.org>; stable@vger.kernel.org; Fabrizio Castro <fabrizio.castro.jz@renesas.com>
> Subject: [PATCH 08/15] dmaengine: sh: rz-dmac: fix device leak on probe failure
>
> Make sure to drop the reference taken when looking up the ICU device
> during probe also on probe failures (e.g. probe deferral).
>
> Fixes: 7de873201c44 ("dmaengine: sh: rz-dmac: Add RZ/V2H(P) support")
> Cc: stable@vger.kernel.org # 6.16
> Cc: Fabrizio Castro <fabrizio.castro.jz@renesas.com>
> Signed-off-by: Johan Hovold <johan@kernel.org>

Reviewed-by: Fabrizio Castro <fabrizio.castro.jz@renesas.com>

> ---
> drivers/dma/sh/rz-dmac.c | 13 +++++++++++--
> 1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c
> index 1f687b08d6b8..38137e8d80b9 100644
> --- a/drivers/dma/sh/rz-dmac.c
> +++ b/drivers/dma/sh/rz-dmac.c
> @@ -854,6 +854,13 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac,
> return 0;
> }
>
> +static void rz_dmac_put_device(void *_dev)
> +{
> + struct device *dev = _dev;
> +
> + put_device(dev);
> +}
> +
> static int rz_dmac_parse_of_icu(struct device *dev, struct rz_dmac *dmac)
> {
> struct device_node *np = dev->of_node;
> @@ -876,6 +883,10 @@ static int rz_dmac_parse_of_icu(struct device *dev, struct rz_dmac *dmac)
> return -ENODEV;
> }
>
> + ret = devm_add_action_or_reset(dev, rz_dmac_put_device, &dmac->icu.pdev->dev);
> + if (ret)
> + return ret;
> +
> dmac_index = args.args[0];
> if (dmac_index > RZV2H_MAX_DMAC_INDEX) {
> dev_err(dev, "DMAC index %u invalid.\n", dmac_index);
> @@ -1055,8 +1066,6 @@ static void rz_dmac_remove(struct platform_device *pdev)
> reset_control_assert(dmac->rstc);
> pm_runtime_put(&pdev->dev);
> pm_runtime_disable(&pdev->dev);
> -
> - platform_device_put(dmac->icu.pdev);
> }
>
> static const struct of_device_id of_rz_dmac_match[] = {
> --
> 2.51.0