| From 695fc6414981b885ec34d3956b57c80f48cd2474 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 13 Jun 2020 22:05:18 -0500 |
| Subject: omapfb: fix multiple reference count leaks due to pm_runtime_get_sync |
| |
| 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 7a75dfda98457..00f5a54aaf9b7 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 30d49f3800b33..2bfd9063cdfc3 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 4429ad37b64cd..acecee5b1c102 100644 |
| --- a/drivers/video/fbdev/omap2/omapfb/dss/dss.c |
| +++ b/drivers/video/fbdev/omap2/omapfb/dss/dss.c |
| @@ -778,8 +778,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 156a254705ea5..ab64bf0215e82 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 4da36bcab9779..c6efaca3235a8 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 |
| |