]> www.infradead.org Git - users/hch/misc.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)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Dec 2024 15:26:18 +0000 (10:26 -0500)
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
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index 8d9bf7a0857fde8d68937adb455549638d89646d..ddd7f05e4db9ff2444f2ec90ede171fad0d81bbe 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);