Message ID | 20220318080809.22562-1-zhangqilong3@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [-next] dmaengine: mediatek:Fix PM usage reference leak of tegra | expand |
Il 18/03/22 09:08, Zhang Qilong ha scritto: > From: zhangqilong <zhangqilong3@huawei.com> > > pm_runtime_get_sync will increment pm usage counter even it failed. > Forgetting to putting operation will result in reference leak here. > We fix it: > 1) Replacing it with pm_runtime_resume_and_get to keep usage counter > balanced. > 2) Add putting operation before returning error. > > Fixes:9135408c3ace4 ("dmaengine: mediatek: Add MediaTek UART APDMA support") > Signed-off-by: Zhang Qilong <zhangqilong3@huawei.com> Hello Zhang, I agree with this change, but the commit message is misleading, as this is not Tegra. Please fix it. Regards, Angelo > --- > drivers/dma/mediatek/mtk-uart-apdma.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/dma/mediatek/mtk-uart-apdma.c b/drivers/dma/mediatek/mtk-uart-apdma.c > index 375e7e647df6..a1517ef1f4a0 100644 > --- a/drivers/dma/mediatek/mtk-uart-apdma.c > +++ b/drivers/dma/mediatek/mtk-uart-apdma.c > @@ -274,7 +274,7 @@ static int mtk_uart_apdma_alloc_chan_resources(struct dma_chan *chan) > unsigned int status; > int ret; > > - ret = pm_runtime_get_sync(mtkd->ddev.dev); > + ret = pm_runtime_resume_and_get(mtkd->ddev.dev); > if (ret < 0) { > pm_runtime_put_noidle(chan->device->dev); > return ret; > @@ -288,18 +288,21 @@ static int mtk_uart_apdma_alloc_chan_resources(struct dma_chan *chan) > ret = readx_poll_timeout(readl, c->base + VFF_EN, > status, !status, 10, 100); > if (ret) > - return ret; > + goto err_pm; > > ret = request_irq(c->irq, mtk_uart_apdma_irq_handler, > IRQF_TRIGGER_NONE, KBUILD_MODNAME, chan); > if (ret < 0) { > dev_err(chan->device->dev, "Can't request dma IRQ\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto err_pm; > } > > if (mtkd->support_33bits) > mtk_uart_apdma_write(c, VFF_4G_SUPPORT, VFF_4G_SUPPORT_CLR_B); > > +err_pm: > + pm_runtime_put_noidle(mtkd->ddev.dev); > return ret; > } > >
diff --git a/drivers/dma/mediatek/mtk-uart-apdma.c b/drivers/dma/mediatek/mtk-uart-apdma.c index 375e7e647df6..a1517ef1f4a0 100644 --- a/drivers/dma/mediatek/mtk-uart-apdma.c +++ b/drivers/dma/mediatek/mtk-uart-apdma.c @@ -274,7 +274,7 @@ static int mtk_uart_apdma_alloc_chan_resources(struct dma_chan *chan) unsigned int status; int ret; - ret = pm_runtime_get_sync(mtkd->ddev.dev); + ret = pm_runtime_resume_and_get(mtkd->ddev.dev); if (ret < 0) { pm_runtime_put_noidle(chan->device->dev); return ret; @@ -288,18 +288,21 @@ static int mtk_uart_apdma_alloc_chan_resources(struct dma_chan *chan) ret = readx_poll_timeout(readl, c->base + VFF_EN, status, !status, 10, 100); if (ret) - return ret; + goto err_pm; ret = request_irq(c->irq, mtk_uart_apdma_irq_handler, IRQF_TRIGGER_NONE, KBUILD_MODNAME, chan); if (ret < 0) { dev_err(chan->device->dev, "Can't request dma IRQ\n"); - return -EINVAL; + ret = -EINVAL; + goto err_pm; } if (mtkd->support_33bits) mtk_uart_apdma_write(c, VFF_4G_SUPPORT, VFF_4G_SUPPORT_CLR_B); +err_pm: + pm_runtime_put_noidle(mtkd->ddev.dev); return ret; }