dmaengine Archive on lore.kernel.org
 help / color / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: dmaengine@vger.kernel.org
Cc: "Vinod Koul" <vkoul@kernel.org>,
	"Peter Ujfalusi" <peter.ujfalusi@ti.com>,
	"Florian Fainelli" <f.fainelli@gmail.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Green Wan" <green.wan@sifive.com>,
	"Kukjin Kim" <kgene@kernel.org>,
	"Krzysztof Kozlowski" <krzk@kernel.org>,
	"Andreas Färber" <afaerber@suse.de>,
	"Sean Wang" <sean.wang@mediatek.com>,
	"Eugeniy Paltsev" <Eugeniy.Paltsev@synopsys.com>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"NXP Linux Team" <linux-imx@nxp.com>,
	"Robert Jarzmik" <robert.jarzmik@free.fr>,
	"Sascha Hauer" <s.hauer@pengutronix.de>
Subject: [PATCH 9/9] dmaengine: imx-sdma: Fix memory leak
Date: Mon, 16 Dec 2019 11:53:28 +0100
Message-ID: <20191216105328.15198-10-s.hauer@pengutronix.de> (raw)
In-Reply-To: <20191216105328.15198-1-s.hauer@pengutronix.de>

The current descriptor is not on any list of the virtual DMA channel.
Once sdma_terminate_all() is called when a descriptor is currently
in flight then this one is forgotten to be freed. We have to call
vchan_terminate_vdesc() on this descriptor to re-add it to the lists.
Now that we also free the currently running descriptor we can (and
actually have to) remove the current descriptor from its list also
for the cyclic case.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/dma/imx-sdma.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 99dbfd9039cf..066b21a32232 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -760,12 +760,8 @@ static void sdma_start_desc(struct sdma_channel *sdmac)
 		return;
 	}
 	sdmac->desc = desc = to_sdma_desc(&vd->tx);
-	/*
-	 * Do not delete the node in desc_issued list in cyclic mode, otherwise
-	 * the desc allocated will never be freed in vchan_dma_desc_free_list
-	 */
-	if (!(sdmac->flags & IMX_DMA_SG_LOOP))
-		list_del(&vd->node);
+
+	list_del(&vd->node);
 
 	sdma->channel_control[channel].base_bd_ptr = desc->bd_phys;
 	sdma->channel_control[channel].current_bd_ptr = desc->bd_phys;
@@ -1071,7 +1067,6 @@ static void sdma_channel_terminate_work(struct work_struct *work)
 
 	spin_lock_irqsave(&sdmac->vc.lock, flags);
 	vchan_get_all_descriptors(&sdmac->vc, &head);
-	sdmac->desc = NULL;
 	spin_unlock_irqrestore(&sdmac->vc.lock, flags);
 	vchan_dma_desc_free_list(&sdmac->vc, &head);
 	sdmac->context_loaded = false;
@@ -1080,11 +1075,19 @@ static void sdma_channel_terminate_work(struct work_struct *work)
 static int sdma_terminate_all(struct dma_chan *chan)
 {
 	struct sdma_channel *sdmac = to_sdma_chan(chan);
+	unsigned long flags;
+
+	spin_lock_irqsave(&sdmac->vc.lock, flags);
 
 	sdma_disable_channel(chan);
 
-	if (sdmac->desc)
+	if (sdmac->desc) {
+		vchan_terminate_vdesc(&sdmac->desc->vd);
+		sdmac->desc = NULL;
 		schedule_work(&sdmac->terminate_worker);
+	}
+
+	spin_unlock_irqrestore(&sdmac->vc.lock, flags);
 
 	return 0;
 }
-- 
2.24.0


  parent reply index

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-16 10:53 [PATCH v3 0/9] dmaengine: virt-dma related fixes Sascha Hauer
2019-12-16 10:53 ` [PATCH 1/9] dmaengine: bcm2835: do not call vchan_vdesc_fini() with lock held Sascha Hauer
2019-12-16 10:53 ` [PATCH 2/9] dmaengine: virt-dma: Add missing locking Sascha Hauer
2019-12-16 10:53 ` [PATCH 3/9] dmaengine: virt-dma: remove debug message Sascha Hauer
2019-12-16 10:53 ` [PATCH 4/9] dmaengine: virt-dma: Do not call desc_free() under a spin_lock Sascha Hauer
2019-12-16 10:53 ` [PATCH 5/9] dmaengine: virt-dma: Add missing locking around list operations Sascha Hauer
2019-12-16 10:53 ` [PATCH 6/9] dmaengine: virt-dma: use vchan_vdesc_fini() to free descriptors Sascha Hauer
2019-12-16 10:53 ` [PATCH 7/9] dmaengine: imx-sdma: rename function Sascha Hauer
2019-12-16 10:53 ` [PATCH 8/9] dmaengine: imx-sdma: find desc first in sdma_tx_status Sascha Hauer
2019-12-16 10:53 ` Sascha Hauer [this message]
2019-12-18 10:09   ` [PATCH 9/9] dmaengine: imx-sdma: Fix memory leak Robin Gong
2019-12-16 11:49 ` [PATCH v3 0/9] dmaengine: virt-dma related fixes Peter Ujfalusi
2019-12-24  6:25 ` Vinod Koul

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191216105328.15198-10-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=Eugeniy.Paltsev@synopsys.com \
    --cc=afaerber@suse.de \
    --cc=dmaengine@vger.kernel.org \
    --cc=f.fainelli@gmail.com \
    --cc=green.wan@sifive.com \
    --cc=kernel@pengutronix.de \
    --cc=kgene@kernel.org \
    --cc=krzk@kernel.org \
    --cc=linux-imx@nxp.com \
    --cc=mripard@kernel.org \
    --cc=peter.ujfalusi@ti.com \
    --cc=robert.jarzmik@free.fr \
    --cc=sean.wang@mediatek.com \
    --cc=vkoul@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

dmaengine Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dmaengine/0 dmaengine/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dmaengine dmaengine/ https://lore.kernel.org/dmaengine \
		dmaengine@vger.kernel.org
	public-inbox-index dmaengine

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.dmaengine


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git