diff mbox series

spi: spi-zynqmp-gqspi: Fix runtime PM imbalance in zynqmp_qspi_probe

Message ID 20210408092559.3824-1-dinghao.liu@zju.edu.cn
State Accepted
Commit a21fbc42807b15b74b0891bd557063e6acf4fcae
Headers show
Series spi: spi-zynqmp-gqspi: Fix runtime PM imbalance in zynqmp_qspi_probe | expand

Commit Message

Dinghao Liu April 8, 2021, 9:25 a.m. UTC
When platform_get_irq() fails, a pairing PM usage counter
increment is needed to keep the counter balanced. It's the
same for the following error paths.

Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
---
 drivers/spi/spi-zynqmp-gqspi.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Quanyang Wang April 9, 2021, 1:33 a.m. UTC | #1
Hi Dinghao,

On 4/8/21 6:33 PM, Michal Simek wrote:
> ++

>

> On 4/8/21 11:25 AM, Dinghao Liu wrote:

>> When platform_get_irq() fails, a pairing PM usage counter

>> increment is needed to keep the counter balanced. It's the

>> same for the following error paths.

>>

>> Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>

>> ---

>>   drivers/spi/spi-zynqmp-gqspi.c | 1 +

>>   1 file changed, 1 insertion(+)

>>

>> diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c

>> index c8fa6ee18ae7..95963a2de64a 100644

>> --- a/drivers/spi/spi-zynqmp-gqspi.c

>> +++ b/drivers/spi/spi-zynqmp-gqspi.c

>> @@ -1197,6 +1197,7 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)

>>   	return 0;

>>   

>>   clk_dis_all:

>> +	pm_runtime_get_noresume(&pdev->dev);

>>   	pm_runtime_set_suspended(&pdev->dev);

>>   	pm_runtime_disable(&pdev->dev);

>>   	clk_disable_unprepare(xqspi->refclk);

>>

The imbalance is because pm_runtime_put_autosuspend is called to make 
counter to be -1.

It looks strange that there is no counter increament op before 
pm_runtime_put_autosuspend.

In my limited understanding, it should look like:

......

pm_runtime_enable

pm_runtime_get_sync   //increase counter to one to resume device

DO OPERATIONS HERE

pm_runtime_mark_last_busy
pm_runtime_put_autosuspend   //decrease counter to zero and trigger suspend

return 0;

error_path:

pm_runtime_put_sync

pm_runtime_disable

return err;


Am I missing something?

Thanks,

Quanyang
Dinghao Liu April 9, 2021, 7:53 a.m. UTC | #2
> Hi Dinghao,
> 
> On 4/8/21 6:33 PM, Michal Simek wrote:
> > ++
> >
> > On 4/8/21 11:25 AM, Dinghao Liu wrote:
> >> When platform_get_irq() fails, a pairing PM usage counter
> >> increment is needed to keep the counter balanced. It's the
> >> same for the following error paths.
> >>
> >> Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
> >> ---
> >>   drivers/spi/spi-zynqmp-gqspi.c | 1 +
> >>   1 file changed, 1 insertion(+)
> >>
> >> diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c
> >> index c8fa6ee18ae7..95963a2de64a 100644
> >> --- a/drivers/spi/spi-zynqmp-gqspi.c
> >> +++ b/drivers/spi/spi-zynqmp-gqspi.c
> >> @@ -1197,6 +1197,7 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)
> >>   	return 0;
> >>   
> >>   clk_dis_all:
> >> +	pm_runtime_get_noresume(&pdev->dev);
> >>   	pm_runtime_set_suspended(&pdev->dev);
> >>   	pm_runtime_disable(&pdev->dev);
> >>   	clk_disable_unprepare(xqspi->refclk);
> >>
> The imbalance is because pm_runtime_put_autosuspend is called to make 
> counter to be -1.
> 
> It looks strange that there is no counter increament op before 
> pm_runtime_put_autosuspend.
> 
> In my limited understanding, it should look like:
> 
> ......
> 
> pm_runtime_enable
> 
> pm_runtime_get_sync   //increase counter to one to resume device
> 
> DO OPERATIONS HERE
> 
> pm_runtime_mark_last_busy
> pm_runtime_put_autosuspend   //decrease counter to zero and trigger suspend
> 
> return 0;
> 
> error_path:
> 
> pm_runtime_put_sync
> 
> pm_runtime_disable
> 
> return err;
> 
> 
> Am I missing something?
> 

Thanks for point out this! Usually there is an increment refcount in a 
_probe function and a decrement refcount in a _remove function. Sometimes 
the refcount decrement is in the _probe and the increment is in the _remove. 
But the refcount is balanced in both cases. So I think zynqmp_qspi_remove()
needs a refcount increment to fix this bug.

Regards,
Dinghao
diff mbox series

Patch

diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c
index c8fa6ee18ae7..95963a2de64a 100644
--- a/drivers/spi/spi-zynqmp-gqspi.c
+++ b/drivers/spi/spi-zynqmp-gqspi.c
@@ -1197,6 +1197,7 @@  static int zynqmp_qspi_probe(struct platform_device *pdev)
 	return 0;
 
 clk_dis_all:
+	pm_runtime_get_noresume(&pdev->dev);
 	pm_runtime_set_suspended(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 	clk_disable_unprepare(xqspi->refclk);