]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/amdgpu: drop redundant sched job cleanup when cs is aborted
authorGuchun Chen <guchun.chen@amd.com>
Wed, 26 Apr 2023 01:46:54 +0000 (09:46 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 May 2023 11:59:05 +0000 (13:59 +0200)
commit 1253685f0d3eb3eab0bfc4bf15ab341a5f3da0c8 upstream.

Once command submission failed due to userptr invalidation in
amdgpu_cs_submit, legacy code will perform cleanup of scheduler
job. However, it's not needed at all, as former commit has integrated
job cleanup stuff into amdgpu_job_free. Otherwise, because of double
free, a NULL pointer dereference will occur in such scenario.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/2457
Fixes: f7d66fb2ea43 ("drm/amdgpu: cleanup scheduler job initialization v2")
Signed-off-by: Guchun Chen <guchun.chen@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

index 7af3041ccd0e8289d76e50ff46121889209f1f37..40e8da85f04fec97e4eabdcc672cea8ccf66cc93 100644 (file)
@@ -1274,7 +1274,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
                r = drm_sched_job_add_dependency(&leader->base, fence);
                if (r) {
                        dma_fence_put(fence);
-                       goto error_cleanup;
+                       return r;
                }
        }
 
@@ -1301,7 +1301,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
        }
        if (r) {
                r = -EAGAIN;
-               goto error_unlock;
+               mutex_unlock(&p->adev->notifier_lock);
+               return r;
        }
 
        p->fence = dma_fence_get(&leader->base.s_fence->finished);
@@ -1348,14 +1349,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
        mutex_unlock(&p->adev->notifier_lock);
        mutex_unlock(&p->bo_list->bo_list_mutex);
        return 0;
-
-error_unlock:
-       mutex_unlock(&p->adev->notifier_lock);
-
-error_cleanup:
-       for (i = 0; i < p->gang_size; ++i)
-               drm_sched_job_cleanup(&p->jobs[i]->base);
-       return r;
 }
 
 /* Cleanup the parser structure */