lkml.org 
[lkml]   [2020]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 064/217] drm/omap: Fix runtime PM imbalance on error
    Date
    From: Dinghao Liu <dinghao.liu@zju.edu.cn>

    [ Upstream commit a5d704d33245b0799947a3008f9f376dba4d5c91 ]

    pm_runtime_get_sync() increments the runtime PM usage counter
    even when it returns an error code. However, users of its
    direct wrappers in omapdrm assume that PM usage counter will
    not change on error. Thus a pairing decrement is needed on
    the error handling path for these wrappers to keep the counter
    balanced.

    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200822065743.13671-1-dinghao.liu@zju.edu.cn
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/omapdrm/dss/dispc.c | 7 +++++--
    drivers/gpu/drm/omapdrm/dss/dsi.c | 7 +++++--
    drivers/gpu/drm/omapdrm/dss/dss.c | 7 +++++--
    drivers/gpu/drm/omapdrm/dss/hdmi4.c | 6 +++---
    drivers/gpu/drm/omapdrm/dss/hdmi5.c | 6 +++---
    drivers/gpu/drm/omapdrm/dss/venc.c | 7 +++++--
    6 files changed, 26 insertions(+), 14 deletions(-)

    diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
    index 48593932bddf5..599183879caf6 100644
    --- a/drivers/gpu/drm/omapdrm/dss/dispc.c
    +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
    @@ -653,8 +653,11 @@ int dispc_runtime_get(struct dispc_device *dispc)
    DSSDBG("dispc_runtime_get\n");

    r = pm_runtime_get_sync(&dispc->pdev->dev);
    - WARN_ON(r < 0);
    - return r < 0 ? r : 0;
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(&dispc->pdev->dev);
    + return r;
    + }
    + return 0;
    }

    void dispc_runtime_put(struct dispc_device *dispc)
    diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
    index eeccf40bae416..973bfa14a1044 100644
    --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
    +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
    @@ -1112,8 +1112,11 @@ static int dsi_runtime_get(struct dsi_data *dsi)
    DSSDBG("dsi_runtime_get\n");

    r = pm_runtime_get_sync(dsi->dev);
    - WARN_ON(r < 0);
    - return r < 0 ? r : 0;
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(dsi->dev);
    + return r;
    + }
    + return 0;
    }

    static void dsi_runtime_put(struct dsi_data *dsi)
    diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
    index 6ccbc29c4ce4b..d7b2f5bcac169 100644
    --- a/drivers/gpu/drm/omapdrm/dss/dss.c
    +++ b/drivers/gpu/drm/omapdrm/dss/dss.c
    @@ -858,8 +858,11 @@ int dss_runtime_get(struct dss_device *dss)
    DSSDBG("dss_runtime_get\n");

    r = pm_runtime_get_sync(&dss->pdev->dev);
    - WARN_ON(r < 0);
    - return r < 0 ? r : 0;
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(&dss->pdev->dev);
    + return r;
    + }
    + return 0;
    }

    void dss_runtime_put(struct dss_device *dss)
    diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
    index a14fbf06cb301..d120e7e3ca502 100644
    --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
    +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
    @@ -43,10 +43,10 @@ static int hdmi_runtime_get(struct omap_hdmi *hdmi)
    DSSDBG("hdmi_runtime_get\n");

    r = pm_runtime_get_sync(&hdmi->pdev->dev);
    - WARN_ON(r < 0);
    - if (r < 0)
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(&hdmi->pdev->dev);
    return r;
    -
    + }
    return 0;
    }

    diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
    index b738d9750686a..5a04c281900c5 100644
    --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
    +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
    @@ -44,10 +44,10 @@ static int hdmi_runtime_get(struct omap_hdmi *hdmi)
    DSSDBG("hdmi_runtime_get\n");

    r = pm_runtime_get_sync(&hdmi->pdev->dev);
    - WARN_ON(r < 0);
    - if (r < 0)
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(&hdmi->pdev->dev);
    return r;
    -
    + }
    return 0;
    }

    diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
    index 5c027c81760f4..94cf50d837b07 100644
    --- a/drivers/gpu/drm/omapdrm/dss/venc.c
    +++ b/drivers/gpu/drm/omapdrm/dss/venc.c
    @@ -361,8 +361,11 @@ static int venc_runtime_get(struct venc_device *venc)
    DSSDBG("venc_runtime_get\n");

    r = pm_runtime_get_sync(&venc->pdev->dev);
    - WARN_ON(r < 0);
    - return r < 0 ? r : 0;
    + if (WARN_ON(r < 0)) {
    + pm_runtime_put_noidle(&venc->pdev->dev);
    + return r;
    + }
    + return 0;
    }

    static void venc_runtime_put(struct venc_device *venc)
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-12-23 04:09    [W:4.139 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site