]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amdgpu: fix when the cleaner shader is emitted
authorChristian König <christian.koenig@amd.com>
Fri, 6 Dec 2024 13:46:06 +0000 (14:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Dec 2024 17:13:07 +0000 (18:13 +0100)
commit f4df208177d02f1c90f3644da3a2453080b8c24f upstream.

Emitting the cleaner shader must come after the check if a VM switch is
necessary or not.

Otherwise we will emit the cleaner shader every time and not just when it is
necessary because we switched between applications.

This can otherwise crash on gang submit and probably decreases performance
quite a bit.

v2: squash in fix from Srini (Alex)

Signed-off-by: Christian König <christian.koenig@amd.com>
Fixes: ee7a846ea27b ("drm/amdgpu: Emit cleaner shader at end of IB submission")
Acked-by: Alex Deucher <alexander.deucher@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_vm.c

index 6005280f5f38f07c0b5c5f583f1b4e273ac117e9..8d2562d0f143c71718cc656a043edf55e4721a9d 100644 (file)
@@ -674,12 +674,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
        pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping &&
                ring->funcs->emit_wreg;
 
-       if (adev->gfx.enable_cleaner_shader &&
-           ring->funcs->emit_cleaner_shader &&
-           job->enforce_isolation)
-               ring->funcs->emit_cleaner_shader(ring);
-
-       if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync)
+       if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync &&
+           !(job->enforce_isolation && !job->vmid))
                return 0;
 
        amdgpu_ring_ib_begin(ring);
@@ -690,6 +686,11 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
        if (need_pipe_sync)
                amdgpu_ring_emit_pipeline_sync(ring);
 
+       if (adev->gfx.enable_cleaner_shader &&
+           ring->funcs->emit_cleaner_shader &&
+           job->enforce_isolation)
+               ring->funcs->emit_cleaner_shader(ring);
+
        if (vm_flush_needed) {
                trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr);
                amdgpu_ring_emit_vm_flush(ring, job->vmid, job->vm_pd_addr);