@@ -754,15 +754,17 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
754
754
bool need_pipe_sync )
755
755
{
756
756
struct amdgpu_device * adev = ring -> adev ;
757
+ struct amdgpu_isolation * isolation = & adev -> isolation [ring -> xcp_id ];
757
758
unsigned vmhub = ring -> vm_hub ;
758
759
struct amdgpu_vmid_mgr * id_mgr = & adev -> vm_manager .id_mgr [vmhub ];
759
760
struct amdgpu_vmid * id = & id_mgr -> ids [job -> vmid ];
760
761
bool spm_update_needed = job -> spm_update_needed ;
761
762
bool gds_switch_needed = ring -> funcs -> emit_gds_switch &&
762
763
job -> gds_switch_needed ;
763
764
bool vm_flush_needed = job -> vm_needs_flush ;
764
- struct dma_fence * fence = NULL ;
765
+ bool cleaner_shader_needed = false ;
765
766
bool pasid_mapping_needed = false;
767
+ struct dma_fence * fence = NULL ;
766
768
unsigned int patch ;
767
769
int r ;
768
770
@@ -785,8 +787,12 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
785
787
pasid_mapping_needed &= adev -> gmc .gmc_funcs -> emit_pasid_mapping &&
786
788
ring -> funcs -> emit_wreg ;
787
789
790
+ cleaner_shader_needed = adev -> gfx .enable_cleaner_shader &&
791
+ ring -> funcs -> emit_cleaner_shader && job -> base .s_fence &&
792
+ & job -> base .s_fence -> scheduled == isolation -> spearhead ;
793
+
788
794
if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync &&
789
- !( job -> enforce_isolation && ! job -> vmid ) )
795
+ !cleaner_shader_needed )
790
796
return 0 ;
791
797
792
798
amdgpu_ring_ib_begin (ring );
@@ -797,9 +803,7 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
797
803
if (need_pipe_sync )
798
804
amdgpu_ring_emit_pipeline_sync (ring );
799
805
800
- if (adev -> gfx .enable_cleaner_shader &&
801
- ring -> funcs -> emit_cleaner_shader &&
802
- job -> enforce_isolation )
806
+ if (cleaner_shader_needed )
803
807
ring -> funcs -> emit_cleaner_shader (ring );
804
808
805
809
if (vm_flush_needed ) {
@@ -821,7 +825,7 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
821
825
job -> oa_size );
822
826
}
823
827
824
- if (vm_flush_needed || pasid_mapping_needed ) {
828
+ if (vm_flush_needed || pasid_mapping_needed || cleaner_shader_needed ) {
825
829
r = amdgpu_fence_emit (ring , & fence , NULL , 0 );
826
830
if (r )
827
831
return r ;
@@ -843,6 +847,17 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
843
847
id -> pasid_mapping = dma_fence_get (fence );
844
848
mutex_unlock (& id_mgr -> lock );
845
849
}
850
+
851
+ /*
852
+ * Make sure that all other submissions wait for the cleaner shader to
853
+ * finish before we push them to the HW.
854
+ */
855
+ if (cleaner_shader_needed ) {
856
+ mutex_lock (& adev -> enforce_isolation_mutex );
857
+ dma_fence_put (isolation -> spearhead );
858
+ isolation -> spearhead = dma_fence_get (fence );
859
+ mutex_unlock (& adev -> enforce_isolation_mutex );
860
+ }
846
861
dma_fence_put (fence );
847
862
848
863
amdgpu_ring_patch_cond_exec (ring , patch );
0 commit comments