]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: avoid double drm_exec_fini() in userq validate
authorHongyan Xu <getshell@seu.edu.cn>
Wed, 22 Apr 2026 12:38:17 +0000 (20:38 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 Apr 2026 14:46:29 +0000 (10:46 -0400)
When new_addition is true, amdgpu_userq_vm_validate() calls
drm_exec_fini(&exec) before iterating over the collected HMM ranges and
calling amdgpu_ttm_tt_get_user_pages().

If amdgpu_ttm_tt_get_user_pages() fails in that path, the code jumps to
unlock_all and calls drm_exec_fini(&exec) a second time on the same
exec object. drm_exec_fini() is not idempotent: it frees exec->objects
and may also drop exec->contended and finalize the ww acquire context.

Route that error path directly to the range cleanup once exec has
already been finalized.

Fixes: 42f148788469 ("drm/amdgpu/userqueue: validate userptrs for userqueues")
Issue found using a prototype static analysis tool
and confirmed by code review.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Hongyan Xu <getshell@seu.edu.cn>
Signed-off-by: Slavin Liu <220245772@seu.edu.cn>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c

index d5abf785ca17e38160b4cc8df7b811f475b0d720..a15ca3e35344b5dbb942ead114ff2dd09aae3669 100644 (file)
@@ -1187,7 +1187,7 @@ retry_lock:
                        bo = range->bo;
                        ret = amdgpu_ttm_tt_get_user_pages(bo, range);
                        if (ret)
-                               goto unlock_all;
+                               goto free_ranges;
                }
 
                invalidated = true;
@@ -1214,6 +1214,7 @@ retry_lock:
 
 unlock_all:
        drm_exec_fini(&exec);
+free_ranges:
        xa_for_each(&xa, tmp_key, range) {
                if (!range)
                        continue;