drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails
authorNavid Emamdoost <navid.emamdoost@gmail.com>
Sun, 14 Jun 2020 07:05:28 +0000 (02:05 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 1 Jul 2020 05:59:22 +0000 (01:59 -0400)
The call to pm_runtime_get_sync increments the counter even in case of
failure, leading to incorrect ref count.
In case of failure, decrement the ref count before returning.

Signed-off-by: Navid Emamdoost <navid.emamdoost@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c

index f355d9a..a1aec20 100644 (file)
@@ -716,8 +716,10 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force)
 
        if (!drm_kms_helper_is_poll_worker()) {
                r = pm_runtime_get_sync(connector->dev->dev);
-               if (r < 0)
+               if (r < 0) {
+                       pm_runtime_put_autosuspend(connector->dev->dev);
                        return connector_status_disconnected;
+               }
        }
 
        if (encoder) {
@@ -854,8 +856,10 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force)
 
        if (!drm_kms_helper_is_poll_worker()) {
                r = pm_runtime_get_sync(connector->dev->dev);
-               if (r < 0)
+               if (r < 0) {
+                       pm_runtime_put_autosuspend(connector->dev->dev);
                        return connector_status_disconnected;
+               }
        }
 
        encoder = amdgpu_connector_best_single_encoder(connector);
@@ -977,8 +981,10 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
 
        if (!drm_kms_helper_is_poll_worker()) {
                r = pm_runtime_get_sync(connector->dev->dev);
-               if (r < 0)
+               if (r < 0) {
+                       pm_runtime_put_autosuspend(connector->dev->dev);
                        return connector_status_disconnected;
+               }
        }
 
        if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) {
@@ -1328,8 +1334,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force)
 
        if (!drm_kms_helper_is_poll_worker()) {
                r = pm_runtime_get_sync(connector->dev->dev);
-               if (r < 0)
+               if (r < 0) {
+                       pm_runtime_put_autosuspend(connector->dev->dev);
                        return connector_status_disconnected;
+               }
        }
 
        if (!force && amdgpu_connector_check_hpd_status_unchanged(connector)) {