| From 00d7f4bdc6e6804b6eb0ba39c5adc6ea293b6528 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 14 Jun 2020 02:05:28 -0500 |
| Subject: drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails |
| |
| From: Navid Emamdoost <navid.emamdoost@gmail.com> |
| |
| [ Upstream commit f79f94765f8c39db0b7dec1d335ab046aac03f20 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
| index e9311eb7b8d9f..694f631d9c90d 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c |
| @@ -734,8 +734,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) { |
| @@ -872,8 +874,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); |
| @@ -996,8 +1000,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)) { |
| @@ -1371,8 +1377,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)) { |
| -- |
| 2.25.1 |
| |