lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 179/717] soc: ti: Fix reference imbalance in knav_dma_probe
    Date
    From: Zhang Qilong <zhangqilong3@huawei.com>

    [ Upstream commit b4fa73358c306d747a2200aec6f7acb97e5750e6 ]

    The patch fix two reference leak.

    1) pm_runtime_get_sync will increment pm usage counter even it
    failed. Forgetting to call put operation will result in
    reference leak.

    2) The pm_runtime_enable will increase power disable depth. Thus
    a pairing decrement is needed on the error handling path to
    keep it balanced.

    We fix it by: 1) adding call pm_runtime_put_noidle or
    pm_runtime_put_sync in error handling. 2) adding pm_runtime_disable
    in error handling, to keep usage counter and disable depth balanced.

    Fixes: 88139ed030583 ("soc: ti: add Keystone Navigator DMA support")
    Signed-off-by: Zhang Qilong <zhangqilong3@huawei.com>
    Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/soc/ti/knav_dma.c | 13 +++++++++++--
    1 file changed, 11 insertions(+), 2 deletions(-)

    diff --git a/drivers/soc/ti/knav_dma.c b/drivers/soc/ti/knav_dma.c
    index 8c863ecb1c605..56597f6ea666a 100644
    --- a/drivers/soc/ti/knav_dma.c
    +++ b/drivers/soc/ti/knav_dma.c
    @@ -749,8 +749,9 @@ static int knav_dma_probe(struct platform_device *pdev)
    pm_runtime_enable(kdev->dev);
    ret = pm_runtime_get_sync(kdev->dev);
    if (ret < 0) {
    + pm_runtime_put_noidle(kdev->dev);
    dev_err(kdev->dev, "unable to enable pktdma, err %d\n", ret);
    - return ret;
    + goto err_pm_disable;
    }

    /* Initialise all packet dmas */
    @@ -764,7 +765,8 @@ static int knav_dma_probe(struct platform_device *pdev)

    if (list_empty(&kdev->list)) {
    dev_err(dev, "no valid dma instance\n");
    - return -ENODEV;
    + ret = -ENODEV;
    + goto err_put_sync;
    }

    debugfs_create_file("knav_dma", S_IFREG | S_IRUGO, NULL, NULL,
    @@ -772,6 +774,13 @@ static int knav_dma_probe(struct platform_device *pdev)

    device_ready = true;
    return ret;
    +
    +err_put_sync:
    + pm_runtime_put_sync(kdev->dev);
    +err_pm_disable:
    + pm_runtime_disable(kdev->dev);
    +
    + return ret;
    }

    static int knav_dma_remove(struct platform_device *pdev)
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:10    [W:2.716 / U:0.660 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site