mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 10:31:33 -04:00
drm/amd/display: fix dc_lock leak on GPU reset error paths
On GPU reset, dm_suspend() takes dc_lock and leaves it for dm_resume() to drop. If amdgpu_dm_commit_zero_streams() or dm_dmub_hw_init() fails, the function returns with the lock still held. The matching resume path is then skipped, so every later dc_lock take hangs. Release the cached DC state and unlock before returning the error. Fixes:3cf7a0bc87("drm/amd/display: Catch failures for amdgpu_dm_commit_zero_streams()") Fixes:2b6943df54("drm/amd/display: Pass up errors for reset GPU that fails to init HW") Cc: stable@vger.kernel.org Signed-off-by: Linkai Gong <gonglinkai@kylinos.cn> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
84298acf1c
commit
92a9eebd2a
@@ -1589,6 +1589,9 @@ static int dm_suspend(struct amdgpu_ip_block *ip_block)
|
||||
res = amdgpu_dm_commit_zero_streams(dm->dc);
|
||||
if (res != DC_OK) {
|
||||
drm_err(adev_to_drm(adev), "Failed to commit zero streams: %d\n", res);
|
||||
dc_state_release(dm->cached_dc_state);
|
||||
dm->cached_dc_state = NULL;
|
||||
mutex_unlock(&dm->dc_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1884,6 +1887,9 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
|
||||
r = dm_dmub_hw_init(adev);
|
||||
if (r) {
|
||||
drm_err(adev_to_drm(adev), "DMUB interface failed to initialize: status=%d\n", r);
|
||||
dc_state_release(dm->cached_dc_state);
|
||||
dm->cached_dc_state = NULL;
|
||||
mutex_unlock(&dm->dc_lock);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user