summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@amd.com>2025-10-02 12:42:44 -0500
committerAlex Deucher <alexander.deucher@amd.com>2025-10-13 14:14:34 -0400
commit7877934019d729d1e97ca0160f470e4821bfe553 (patch)
treee6a2e1b0f3f82f83eb318376bf8e6f74b2368883 /drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
parent173360fe49c2cd5ec581056985a7a3d4fbd9f1ab (diff)
drm/amd: Fix error handling with multiple userq IDRs
If multiple userq IDR are in use and there is an error handling one at suspend or resume it will be silently discarded. Switch the suspend/resume() code to use guards and return immediately. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
index 9ad366f29776..1400114dc934 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
@@ -1076,27 +1076,25 @@ int amdgpu_userq_suspend(struct amdgpu_device *adev)
struct amdgpu_usermode_queue *queue;
struct amdgpu_userq_mgr *uqm, *tmp;
int queue_id;
- int ret = 0, r;
+ int r;
if (!ip_mask)
return 0;
- mutex_lock(&adev->userq_mutex);
+ guard(mutex)(&adev->userq_mutex);
list_for_each_entry_safe(uqm, tmp, &adev->userq_mgr_list, list) {
cancel_delayed_work_sync(&uqm->resume_work);
- mutex_lock(&uqm->userq_mutex);
+ guard(mutex)(&uqm->userq_mutex);
idr_for_each_entry(&uqm->userq_idr, queue, queue_id) {
if (adev->in_s0ix)
r = amdgpu_userq_preempt_helper(uqm, queue);
else
r = amdgpu_userq_unmap_helper(uqm, queue);
if (r)
- ret = r;
+ return r;
}
- mutex_unlock(&uqm->userq_mutex);
}
- mutex_unlock(&adev->userq_mutex);
- return ret;
+ return 0;
}
int amdgpu_userq_resume(struct amdgpu_device *adev)
@@ -1105,26 +1103,25 @@ int amdgpu_userq_resume(struct amdgpu_device *adev)
struct amdgpu_usermode_queue *queue;
struct amdgpu_userq_mgr *uqm, *tmp;
int queue_id;
- int ret = 0, r;
+ int r;
if (!ip_mask)
return 0;
- mutex_lock(&adev->userq_mutex);
+ guard(mutex)(&adev->userq_mutex);
list_for_each_entry_safe(uqm, tmp, &adev->userq_mgr_list, list) {
- mutex_lock(&uqm->userq_mutex);
+ guard(mutex)(&uqm->userq_mutex);
idr_for_each_entry(&uqm->userq_idr, queue, queue_id) {
if (adev->in_s0ix)
r = amdgpu_userq_restore_helper(uqm, queue);
else
r = amdgpu_userq_map_helper(uqm, queue);
if (r)
- ret = r;
+ return r;
}
- mutex_unlock(&uqm->userq_mutex);
}
- mutex_unlock(&adev->userq_mutex);
- return ret;
+
+ return 0;
}
int amdgpu_userq_stop_sched_for_enforce_isolation(struct amdgpu_device *adev,