Commit b9074b2d authored by Johan Hovold's avatar Johan Hovold Committed by Vinod Koul
Browse files

dmaengine: at_hdmac: fix device leak on of_dma_xlate()



Make sure to drop the reference taken when looking up the DMA platform
device during of_dma_xlate() when releasing channel resources.

Note that commit 3832b78b ("dmaengine: at_hdmac: add missing
put_device() call in at_dma_xlate()") fixed the leak in a couple of
error paths but the reference is still leaking on successful allocation.

Fixes: bbe89c8e ("at_hdmac: move to generic DMA binding")
Fixes: 3832b78b ("dmaengine: at_hdmac: add missing put_device() call in at_dma_xlate()")
Cc: stable@vger.kernel.org	# 3.10: 3832b78b
Cc: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20251117161258.10679-2-johan@kernel.org


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent c7d436a6
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1765,6 +1765,7 @@ static int atc_alloc_chan_resources(struct dma_chan *chan)
static void atc_free_chan_resources(struct dma_chan *chan)
{
	struct at_dma_chan	*atchan = to_at_dma_chan(chan);
	struct at_dma_slave	*atslave;

	BUG_ON(atc_chan_is_enabled(atchan));

@@ -1774,8 +1775,12 @@ static void atc_free_chan_resources(struct dma_chan *chan)
	/*
	 * Free atslave allocated in at_dma_xlate()
	 */
	kfree(chan->private);
	atslave = chan->private;
	if (atslave) {
		put_device(atslave->dma_dev);
		kfree(atslave);
		chan->private = NULL;
	}

	dev_vdbg(chan2dev(chan), "free_chan_resources: done\n");
}