pm_runtime_get_sync() will increment pm usage at first and it
will resume the device later. If runtime of the device has
error or device is in inaccessible state(or other error state),
resume operation will fail. If we do not call put operation to
decrease the reference, it will result in reference leak in
dss_runtime_get. Moreover, this device cannot enter the idle state
and always stay busy or other non-idle state later. So we should
fix it through adding pm_runtime_put_noidle.

Fixes: 7b295257a13d8 ("drm: omapdrm: dss: Pass DSS private structure to runtime 
PM functions")

Signed-off-by: Zhang Qilong <zhangqilo...@huawei.com>
---
 drivers/gpu/drm/omapdrm/dss/dss.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c 
b/drivers/gpu/drm/omapdrm/dss/dss.c
index 6ccbc29c4ce4..9571f3db6f71 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -858,8 +858,12 @@ 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)
-- 
2.25.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to