lkml.org 
[lkml]   [2020]   [Sep]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 030/125] omapfb: fix multiple reference count leaks due to pm_runtime_get_sync
    Date
    From: Aditya Pakki <pakki001@umn.edu>

    [ Upstream commit 78c2ce9bde70be5be7e3615a2ae7024ed8173087 ]

    On calling pm_runtime_get_sync() the reference count of the device
    is incremented. In case of failure, decrement the
    reference count before returning the error.

    Signed-off-by: Aditya Pakki <pakki001@umn.edu>
    Cc: kjlu@umn.edu
    Cc: wu000273@umn.edu
    Cc: Allison Randal <allison@lohutok.net>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Enrico Weigelt <info@metux.net>
    cc: "Andrew F. Davis" <afd@ti.com>
    Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
    Cc: Alexios Zavras <alexios.zavras@intel.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: YueHaibing <yuehaibing@huawei.com>
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200614030528.128064-1-pakki001@umn.edu
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/video/fbdev/omap2/omapfb/dss/dispc.c | 7 +++++--
    drivers/video/fbdev/omap2/omapfb/dss/dsi.c | 7 +++++--
    drivers/video/fbdev/omap2/omapfb/dss/dss.c | 7 +++++--
    drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c | 5 +++--
    drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c | 5 +++--
    drivers/video/fbdev/omap2/omapfb/dss/venc.c | 7 +++++--
    6 files changed, 26 insertions(+), 12 deletions(-)

    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dispc.c b/drivers/video/fbdev/omap2/omapfb/dss/dispc.c
    index a06d9c25765c5..0bd582e845f31 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/dispc.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/dispc.c
    @@ -531,8 +531,11 @@ int dispc_runtime_get(void)
    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_sync(&dispc.pdev->dev);
    + return r;
    + }
    + return 0;
    }
    EXPORT_SYMBOL(dispc_runtime_get);

    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dsi.c b/drivers/video/fbdev/omap2/omapfb/dss/dsi.c
    index 8e1d60d48dbb0..50792d31533bf 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/dsi.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/dsi.c
    @@ -1148,8 +1148,11 @@ static int dsi_runtime_get(struct platform_device *dsidev)
    DSSDBG("dsi_runtime_get\n");

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

    static void dsi_runtime_put(struct platform_device *dsidev)
    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dss.c b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
    index b6c6c24979dd6..faebf9a773ba5 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/dss.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
    @@ -779,8 +779,11 @@ int dss_runtime_get(void)
    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_sync(&dss.pdev->dev);
    + return r;
    + }
    + return 0;
    }

    void dss_runtime_put(void)
    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c b/drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c
    index 28de56e21c74b..9fd9a02bb871d 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c
    @@ -50,9 +50,10 @@ static int hdmi_runtime_get(void)
    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_sync(&hdmi.pdev->dev);
    return r;
    + }

    return 0;
    }
    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c b/drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c
    index 2e2fcc3d6d4f7..13f3a5ce55294 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c
    @@ -54,9 +54,10 @@ static int hdmi_runtime_get(void)
    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_sync(&hdmi.pdev->dev);
    return r;
    + }

    return 0;
    }
    diff --git a/drivers/video/fbdev/omap2/omapfb/dss/venc.c b/drivers/video/fbdev/omap2/omapfb/dss/venc.c
    index 392464da12e41..96714b4596d2d 100644
    --- a/drivers/video/fbdev/omap2/omapfb/dss/venc.c
    +++ b/drivers/video/fbdev/omap2/omapfb/dss/venc.c
    @@ -402,8 +402,11 @@ static int venc_runtime_get(void)
    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_sync(&venc.pdev->dev);
    + return r;
    + }
    + return 0;
    }

    static void venc_runtime_put(void)
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-01 17:26    [W:4.183 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site