Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp665979ybp; Wed, 9 Oct 2019 02:14:15 -0700 (PDT) X-Google-Smtp-Source: APXvYqwU41s7MNO0wHTUdOhJtKHtsW34uGINGnDW2du6i3YdnezBatXFRn2Nhv6URHaSkuqeJ2pV X-Received: by 2002:a50:ed90:: with SMTP id h16mr1925422edr.185.1570612454980; Wed, 09 Oct 2019 02:14:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570612454; cv=none; d=google.com; s=arc-20160816; b=0g0En8I7bLa0v7e7Z4GeGXCnQBHjsG9XTmyv5HLybslJAjgw7ZBFGK/j7VG8BmlMrA +FaazKD83Dl6LQ21H+yOicN8ocZDRwf8ZFwzaw2nt3hFSvxb+MNAd7ATu4YPdsniAJ8a N/jgIraXbCNgd9S65cLq8YXlq01rA4frRpugk/6cowweT2cLVKdEa3mMW8e/6P1g/9B0 yY+bHaybv9eikymdwKhjStvvCohGMWDea+is5w+wNFTwocpsf08ozOtN1YQMxS4ZX0Sf bfpLpm8lYSbXbq8V0xXGcCYakELQy4ft6Z1dwERpqWHlUb1u4Av73FSI6bJ3DwI0e/HE zrnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=O5t0e/gQse8Qw5vCIuQfPPdmME+fzFWGPG6GN+mUsd8=; b=yJxdhqhOohmCuvHbApWZHUf6YhJlTVYDnLdMd5TVHOlaAsZg3QArbOrgSaKCH9c90Q end5nqAByQtkJbPL3n/tqXL9gi4WSanNTpSUc4E/pqUMTn02KNe0vKqTEPOM6TT67dUP Rx+DX4hYEqEIv/p08wVDEveu4Rc3/GQgm2UdaJx7+lkgte7XCQiSI0lMCbRGt/4S04aq e6NvFw6Pt8Mkk4R2B/Zm2ZNbgs+2Aw3NlcAjqg6ePOgH+5FJuuaHSVMwGDhVBoe+Htou r2xoSX/iUbrgIJflEA/WMUC0b4BO8Abhb6fppNx4aEDIckobrUNEBFpABkskvMFLn+22 Zuow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=LoukXlwG; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 96si1000042edq.24.2019.10.09.02.13.51; Wed, 09 Oct 2019 02:14:14 -0700 (PDT) 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=@linaro.org header.s=google header.b=LoukXlwG; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729893AbfJIJLt (ORCPT + 99 others); Wed, 9 Oct 2019 05:11:49 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:34066 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725942AbfJIJLt (ORCPT ); Wed, 9 Oct 2019 05:11:49 -0400 Received: by mail-pg1-f193.google.com with SMTP id y35so1018482pgl.1 for ; Wed, 09 Oct 2019 02:11:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=O5t0e/gQse8Qw5vCIuQfPPdmME+fzFWGPG6GN+mUsd8=; b=LoukXlwGXcDpo42+DF7QA/ampXViZ8/qogRylR7ilMVvqTBR5C9prHUwp/JSDEPfHL wsxGbIsyAs24d6jeOL6KuV/JtF+Bv0Ynez+O/OD1IreIVHoI6xvNB3GNlyzXYHlwOlSN qs6kclNoibg5qb4HjCbyCz4nrnD4jp51YnY7Vtez7bL2fs8xoHY/Lu483aW2/OhTtrFU RkGQp/OlYBo8hzcukAFIAdhIkaiWkCN+pyCR4jwmvA13SyWGlgYSF83Vzk9BBLK64K9D ZxKnipZJPSwWSUr0wT+CLOGLFFiTLomqkczZR2ZISQd2W5jqsOVJZ+zRORQdSr6zul80 Ozew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=O5t0e/gQse8Qw5vCIuQfPPdmME+fzFWGPG6GN+mUsd8=; b=M5iNPKeeNyXq3MNYBtQdIJMAAqVC/wDJ5hsz6J3Kcu2soeGzWuXaCAANTdCi5t+8gF sIyYobNirwJZbQbkfIF/WXxIK+GiLRr3smSI95wgS1k3qJMjBS5FB194YQZXaEP6E5h/ P/2oUdEk7qcS2gGxH4+7SZDs+VwS90cLSgT6n6J8K0YZ9O0SCZNs622FLceHyZSvTxZd Fan3E1ePuAyy0jfNQDP0va+UYdAug0i11nwASVg1kuAfk+Mwvtq7uzYzWrP8KGWfUuLH QCr6qv5pKOaYiKr2Tx7Kkvu1AwqKXW8Hhy4cF06ZGCJeQLCxinKqPY3Db3f8oaT3U6b9 4aDQ== X-Gm-Message-State: APjAAAWvoASYP0PvxefSlJVXc71iHYaJ2HKcuPbyQSvVWH4rOBGqFvNx u5THMpNfSpzBiN6bJCWgWYhqNA== X-Received: by 2002:a63:1c06:: with SMTP id c6mr3153861pgc.417.1570612306950; Wed, 09 Oct 2019 02:11:46 -0700 (PDT) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id m68sm1642818pfb.122.2019.10.09.02.11.43 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 09 Oct 2019 02:11:46 -0700 (PDT) From: Baolin Wang To: vkoul@kernel.org Cc: orsonzhai@gmail.com, zhang.lyra@gmail.com, dan.j.williams@intel.com, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, eric.long@unisoc.com, zhenfang.wang@unisoc.com, baolin.wang@linaro.org Subject: [PATCH] dmaengine: sprd: Fix the possible memory leak issue Date: Wed, 9 Oct 2019 17:11:30 +0800 Message-Id: <170dbbc6d5366b6fa974ce2d366652e23a334251.1570609788.git.baolin.wang@linaro.org> X-Mailer: git-send-email 1.7.9.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If we terminate the channel to free all descriptors associated with this channel, we will leak the memory of current descriptor if the current descriptor is not completed, since it had been deteled from the desc_issued list and have not been added into the desc_completed list. Thus we should check if current descriptor is completed or not, when freeing the descriptors associated with one channel, if not, we should free it to avoid this issue. Fixes: 9b3b8171f7f4 ("dmaengine: sprd: Add Spreadtrum DMA driver") Reported-by: Zhenfang Wang Tested-by: Zhenfang Wang Signed-off-by: Baolin Wang --- drivers/dma/sprd-dma.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c index 60d2c6b..32402c2 100644 --- a/drivers/dma/sprd-dma.c +++ b/drivers/dma/sprd-dma.c @@ -212,6 +212,7 @@ struct sprd_dma_dev { struct sprd_dma_chn channels[0]; }; +static void sprd_dma_free_desc(struct virt_dma_desc *vd); static bool sprd_dma_filter_fn(struct dma_chan *chan, void *param); static struct of_dma_filter_info sprd_dma_info = { .filter_fn = sprd_dma_filter_fn, @@ -613,12 +614,19 @@ static int sprd_dma_alloc_chan_resources(struct dma_chan *chan) static void sprd_dma_free_chan_resources(struct dma_chan *chan) { struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); + struct virt_dma_desc *cur_vd = NULL; unsigned long flags; spin_lock_irqsave(&schan->vc.lock, flags); + if (schan->cur_desc) + cur_vd = &schan->cur_desc->vd; + sprd_dma_stop(schan); spin_unlock_irqrestore(&schan->vc.lock, flags); + if (cur_vd) + sprd_dma_free_desc(cur_vd); + vchan_free_chan_resources(&schan->vc); pm_runtime_put(chan->device->dev); } @@ -1031,15 +1039,22 @@ static int sprd_dma_resume(struct dma_chan *chan) static int sprd_dma_terminate_all(struct dma_chan *chan) { struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); + struct virt_dma_desc *cur_vd = NULL; unsigned long flags; LIST_HEAD(head); spin_lock_irqsave(&schan->vc.lock, flags); + if (schan->cur_desc) + cur_vd = &schan->cur_desc->vd; + sprd_dma_stop(schan); vchan_get_all_descriptors(&schan->vc, &head); spin_unlock_irqrestore(&schan->vc.lock, flags); + if (cur_vd) + sprd_dma_free_desc(cur_vd); + vchan_dma_desc_free_list(&schan->vc, &head); return 0; } -- 1.7.9.5