Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1604830ybv; Fri, 21 Feb 2020 00:08:26 -0800 (PST) X-Google-Smtp-Source: APXvYqyqVMS/fWbQiJ5+DkubvQSd8P7S32Nt1LvqR0cUjfpmd8a9MzgVFFlT8+7BsSZ98BepSGhe X-Received: by 2002:aca:2210:: with SMTP id b16mr966202oic.32.1582272506128; Fri, 21 Feb 2020 00:08:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582272506; cv=none; d=google.com; s=arc-20160816; b=azspBzAe8GYKYG52ls2jfvsPxQtU0zjBHLEHXlAhsnB5UJsdktSc4qIHb9Kwl1UYgg XvbP1z8wUIxGtizH4LtOljc4LoaaRj5czWKwnGyUh+k3rqfSw3xtj84qOE/rE6+1x2Ph ZRlwBqr4oh5hCw4+PfVeZveQ2of6EruxvN89WHPYdHGPYVmTUVWG72P4HapF/Mbsa1WR jM9LoYrvMk+MtNSsmsFKwl6LjP8/4MKntcp5K3QW5knWGCFe1SYbfqC/dzH5OneyfVDX kUhCWUw4mQ+56I7+pP5xjFJRRJFVYywNsF9CJ80/X3LM/oimQDs5Uy+aPIiG4e5UAZg9 K4cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=tfubMQcbHKjpkuIf43Hyujjip4Lyt88z8t2QkbaRpOs=; b=U/ziI11Nt02Lw12ojLa1EO3Rjmal2U/quJfym5EgRplg5M6ZHUhALAbkO2TxzUe1M5 XnpfWF0g9kpmsGklKvoi5LKHC/Mirt6gw7GLBHN7Dw669autL3P6m2sZfl9lRB01qIdF rjpcQ66l/QaWBKEWE+5tzVc7pifwdm6CLTxO0pZyzNo+TY3hFiSeguabMcyRTulW1fg7 qfRvgE5CWO6JOTquc/uvA3ZGJpvke3PhU7oVgQ9DpHbc1DAx2rNJ2mwp9KD9DmOprRAK k7rhD9U9Dm98kJUUJyyojYXs10HJFonEMO+kEEOZJWWcLnDgUVIVwnW/4WyLnvecnwx9 KTrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=h0eI8bCY; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a124si443025oii.138.2020.02.21.00.08.13; Fri, 21 Feb 2020 00:08:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=h0eI8bCY; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732150AbgBUIIK (ORCPT + 99 others); Fri, 21 Feb 2020 03:08:10 -0500 Received: from mail.kernel.org ([198.145.29.99]:42508 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731539AbgBUIIE (ORCPT ); Fri, 21 Feb 2020 03:08:04 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A955C2073A; Fri, 21 Feb 2020 08:08:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582272484; bh=Cnisj9RKGQR/FA7XIim+1rtIYd3BMtJlvkxzs51h6yw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h0eI8bCYAuYDZpR3Uw/k4+0AAwZ8ucjB2s7uk+W3j75xrq/wEuiHh1ycb/cak1V3h 8WVT8G2f5taOVEYzQ1SjuMqJ+WCYW8g+k4mjaaor2Wi4dHMDWCooaup/RAsNez+7Rj xGtS0b+pmAL9QtaT8X5aWbIHyB0GHR0UA+JV/zIY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sascha Hauer , Robin Gong , Vinod Koul , Sasha Levin Subject: [PATCH 5.4 160/344] dmaengine: imx-sdma: Fix memory leak Date: Fri, 21 Feb 2020 08:39:19 +0100 Message-Id: <20200221072403.369335694@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200221072349.335551332@linuxfoundation.org> References: <20200221072349.335551332@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sascha Hauer [ Upstream commit 02939cd167095f16328a1bd5cab5a90b550606df ] 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 Reviewed-by: Robin Gong Tested-by: Robin Gong Link: https://lore.kernel.org/r/20191216105328.15198-10-s.hauer@pengutronix.de Signed-off-by: Vinod Koul Signed-off-by: Sasha Levin --- 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 c27e206a764c3..66f1b2ac5cde4 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_disable_channel_async(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.20.1