On Tue, Dec 7, 2021 at 9:38 AM Baolin Wang <baolin.wang7@xxxxxxxxx> wrote: > > Hi Dongliang, > > On Mon, Dec 6, 2021 at 7:34 PM Dongliang Mu <mudongliangabcd@xxxxxxxxx> wrote: > > > > When pm_runtime_get_sync fails, it forgets to invoke pm_runtime_disable > > in the label err_rpm. > > > > Fix this by moving pm_runtime_disable to label err_rpm. > > > > Fixes: 9b3b8171f7f4 ("dmaengine: sprd: Add Spreadtrum DMA driver") > > Signed-off-by: Dongliang Mu <mudongliangabcd@xxxxxxxxx> > > --- > > Thanks for your patch, but looking at the code in detail, I think we > also should decrease the rpm counter when failing to call the > pm_runtime_get_sync(). Thanks for your reply. There are many different pm_runtime_* API. After I double check the usage of pm_runtime_get_sync, there are two kinds of error handling code: 1. When pm_runtime_get_sync fails, call pm_runtime_put_sync and pm_runtime_disable [1] 2. When pm_runtime_get_sync fails, only call pm_runtime_disable [2] [1] https://elixir.bootlin.com/linux/latest/source/drivers/dma/ti/edma.c#L2402 [2] https://elixir.bootlin.com/linux/latest/source/drivers/dma/ti/cppi41.c#L1098 BTW, is there any standard error handling code of pm runtime API? Or the majority wins? > > --- a/drivers/dma/sprd-dma.c > +++ b/drivers/dma/sprd-dma.c > @@ -1210,7 +1210,7 @@ static int sprd_dma_probe(struct platform_device *pdev) > ret = dma_async_device_register(&sdev->dma_dev); > if (ret < 0) { > dev_err(&pdev->dev, "register dma device failed:%d\n", ret); > - goto err_register; > + goto err_rpm; > } > > sprd_dma_info.dma_cap = sdev->dma_dev.cap_mask; > @@ -1224,10 +1224,9 @@ static int sprd_dma_probe(struct platform_device *pdev) > > err_of_register: > dma_async_device_unregister(&sdev->dma_dev); > -err_register: > +err_rpm: > pm_runtime_put_noidle(&pdev->dev); > pm_runtime_disable(&pdev->dev); > -err_rpm: > sprd_dma_disable(sdev); > return ret; > } > > -- > Baolin Wang