Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752189AbdLFNUz (ORCPT ); Wed, 6 Dec 2017 08:20:55 -0500 Received: from 178.115.242.59.static.drei.at ([178.115.242.59]:53895 "EHLO mail.osadl.at" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1751544AbdLFNUs (ORCPT ); Wed, 6 Dec 2017 08:20:48 -0500 Date: Wed, 6 Dec 2017 14:20:45 +0100 From: Andreas Platschek To: vinod.koul@intel.com Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, dan.j.williams@intel.com Subject: Re: [PATCH] dmaengine: fsl-edma: disable clks on all error paths Message-ID: <20171206132045.GA5040@opentech.at> References: <1512558813-25279-1-git-send-email-andreas.platschek@opentech.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1512558813-25279-1-git-send-email-andreas.platschek@opentech.at> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1690 Lines: 55 Hi, On Wed, 06 Dec 2017, Andreas Platschek wrote: > Previously enabled clks are only disabled if clk_prepare_enable() fails. > However, there are other error paths were the previously enabled > clocks are not disabled. > > Found by Linux Driver Verification project (linuxtesting.org). > > Signed-off-by: Andreas Platschek > --- > drivers/dma/fsl-edma.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c > index 6775f2c74e25..ccb447253cd2 100644 > --- a/drivers/dma/fsl-edma.c > +++ b/drivers/dma/fsl-edma.c > @@ -904,12 +904,23 @@ static int fsl_edma_probe(struct platform_device *pdev) > > res = platform_get_resource(pdev, IORESOURCE_MEM, 1 + i); > fsl_edma->muxbase[i] = devm_ioremap_resource(&pdev->dev, res); > - if (IS_ERR(fsl_edma->muxbase[i])) > + if (IS_ERR(fsl_edma->muxbase[i])) { > + /* disable only clks which were enabled on error */ > + i--; > + for (; i >= 0; i--) > + clk_disable_unprepare(fsl_edma->muxclk[i]); > + > return PTR_ERR(fsl_edma->muxbase[i]); just realized that I made a stupid mistake and overlooked that i is used again... sorry for the noise I'll go over this again. thx! andi > + } > > sprintf(clkname, "dmamux%d", i); > fsl_edma->muxclk[i] = devm_clk_get(&pdev->dev, clkname); > if (IS_ERR(fsl_edma->muxclk[i])) { > + /* disable only clks which were enabled on error */ > + i--; > + for (; i >= 0; i--) > + clk_disable_unprepare(fsl_edma->muxclk[i]); > + > dev_err(&pdev->dev, "Missing DMAMUX block clock.\n"); > return PTR_ERR(fsl_edma->muxclk[i]); > } > -- > 2.11.0 >