lkml.org 
[lkml]   [2021]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 09/29] drm/tegra: sor: Do not leak runtime PM reference
    Date
    From: "Pavel Machek (CIP)" <pavel@denx.de>

    [ Upstream commit 73a395c46704304b96bc5e2ee19be31124025c0c ]

    It's theoretically possible for the runtime PM reference to leak if the
    code fails anywhere between the pm_runtime_resume_and_get() and
    pm_runtime_put() calls, so make sure to release the runtime PM reference
    in that case.

    Practically this will never happen because none of the functions will
    fail on Tegra, but it's better for the code to be pedantic in case these
    assumptions will ever become wrong.

    Signed-off-by: Pavel Machek (CIP) <pavel@denx.de>
    [treding@nvidia.com: add commit message]
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/tegra/sor.c | 14 ++++++++++----
    1 file changed, 10 insertions(+), 4 deletions(-)

    diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c
    index 6c3d22165239..0419b6105c8a 100644
    --- a/drivers/gpu/drm/tegra/sor.c
    +++ b/drivers/gpu/drm/tegra/sor.c
    @@ -2875,21 +2875,21 @@ static int tegra_sor_init(struct host1x_client *client)
    if (err < 0) {
    dev_err(sor->dev, "failed to acquire SOR reset: %d\n",
    err);
    - return err;
    + goto rpm_put;
    }

    err = reset_control_assert(sor->rst);
    if (err < 0) {
    dev_err(sor->dev, "failed to assert SOR reset: %d\n",
    err);
    - return err;
    + goto rpm_put;
    }
    }

    err = clk_prepare_enable(sor->clk);
    if (err < 0) {
    dev_err(sor->dev, "failed to enable clock: %d\n", err);
    - return err;
    + goto rpm_put;
    }

    usleep_range(1000, 3000);
    @@ -2900,7 +2900,7 @@ static int tegra_sor_init(struct host1x_client *client)
    dev_err(sor->dev, "failed to deassert SOR reset: %d\n",
    err);
    clk_disable_unprepare(sor->clk);
    - return err;
    + goto rpm_put;
    }

    reset_control_release(sor->rst);
    @@ -2929,6 +2929,12 @@ static int tegra_sor_init(struct host1x_client *client)
    tegra_sor_writel(sor, value, SOR_INT_MASK);

    return 0;
    +
    +rpm_put:
    + if (sor->rst)
    + pm_runtime_put(sor->dev);
    +
    + return err;
    }

    static int tegra_sor_exit(struct host1x_client *client)
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-06-07 18:19    [W:4.599 / U:0.596 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site