| From 4511a9bb227ca37a1ddee811b44bcb33bbcdf10c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 25 May 2020 22:12:46 +0800 |
| Subject: ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed |
| |
| From: Xiyu Yang <xiyuyang19@fudan.edu.cn> |
| |
| [ Upstream commit 36124fb19f1ae68a500cd76a76d40c6e81bee346 ] |
| |
| fsl_asrc_dma_hw_params() invokes dma_request_channel() or |
| fsl_asrc_get_dma_channel(), which returns a reference of the specified |
| dma_chan object to "pair->dma_chan[dir]" with increased refcnt. |
| |
| The reference counting issue happens in one exception handling path of |
| fsl_asrc_dma_hw_params(). When config DMA channel failed for Back-End, |
| the function forgets to decrease the refcnt increased by |
| dma_request_channel() or fsl_asrc_get_dma_channel(), causing a refcnt |
| leak. |
| |
| Fix this issue by calling dma_release_channel() when config DMA channel |
| failed. |
| |
| Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn> |
| Signed-off-by: Xin Tan <tanxin.ctf@gmail.com> |
| Link: https://lore.kernel.org/r/1590415966-52416-1-git-send-email-xiyuyang19@fudan.edu.cn |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/fsl/fsl_asrc_dma.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c |
| index e1b97e59275a9..15d7e6da05556 100644 |
| --- a/sound/soc/fsl/fsl_asrc_dma.c |
| +++ b/sound/soc/fsl/fsl_asrc_dma.c |
| @@ -243,6 +243,7 @@ static int fsl_asrc_dma_hw_params(struct snd_pcm_substream *substream, |
| ret = dmaengine_slave_config(pair->dma_chan[dir], &config_be); |
| if (ret) { |
| dev_err(dev, "failed to config DMA channel for Back-End\n"); |
| + dma_release_channel(pair->dma_chan[dir]); |
| return ret; |
| } |
| |
| -- |
| 2.25.1 |
| |