33
33
34
34
#include <drm/amdgpu_drm.h>
35
35
#include <drm/drm_drv.h>
36
+ #include <drm/drm_exec.h>
36
37
#include <drm/drm_gem_ttm_helper.h>
37
38
#include <drm/ttm/ttm_tt.h>
38
39
@@ -198,29 +199,24 @@ static void amdgpu_gem_object_close(struct drm_gem_object *obj,
198
199
struct amdgpu_fpriv * fpriv = file_priv -> driver_priv ;
199
200
struct amdgpu_vm * vm = & fpriv -> vm ;
200
201
201
- struct amdgpu_bo_list_entry vm_pd ;
202
- struct list_head list , duplicates ;
203
202
struct dma_fence * fence = NULL ;
204
- struct ttm_validate_buffer tv ;
205
- struct ww_acquire_ctx ticket ;
206
203
struct amdgpu_bo_va * bo_va ;
204
+ struct drm_exec exec ;
207
205
long r ;
208
206
209
- INIT_LIST_HEAD (& list );
210
- INIT_LIST_HEAD (& duplicates );
211
-
212
- tv .bo = & bo -> tbo ;
213
- tv .num_shared = 2 ;
214
- list_add (& tv .head , & list );
215
-
216
- amdgpu_vm_get_pd_bo (vm , & list , & vm_pd );
217
-
218
- r = ttm_eu_reserve_buffers (& ticket , & list , false, & duplicates );
219
- if (r ) {
220
- dev_err (adev -> dev , "leaking bo va because "
221
- "we fail to reserve bo (%ld)\n" , r );
222
- return ;
207
+ drm_exec_init (& exec , DRM_EXEC_IGNORE_DUPLICATES );
208
+ drm_exec_until_all_locked (& exec ) {
209
+ r = drm_exec_prepare_obj (& exec , & bo -> tbo .base , 1 );
210
+ drm_exec_retry_on_contention (& exec );
211
+ if (unlikely (r ))
212
+ goto out_unlock ;
213
+
214
+ r = amdgpu_vm_lock_pd (vm , & exec , 0 );
215
+ drm_exec_retry_on_contention (& exec );
216
+ if (unlikely (r ))
217
+ goto out_unlock ;
223
218
}
219
+
224
220
bo_va = amdgpu_vm_bo_find (vm , bo );
225
221
if (!bo_va || -- bo_va -> ref_count )
226
222
goto out_unlock ;
@@ -230,17 +226,19 @@ static void amdgpu_gem_object_close(struct drm_gem_object *obj,
230
226
goto out_unlock ;
231
227
232
228
r = amdgpu_vm_clear_freed (adev , vm , & fence );
229
+ if (unlikely (r < 0 ))
230
+ dev_err (adev -> dev , "failed to clear page "
231
+ "tables on GEM object close (%ld)\n" , r );
233
232
if (r || !fence )
234
233
goto out_unlock ;
235
234
236
235
amdgpu_bo_fence (bo , fence , true);
237
236
dma_fence_put (fence );
238
237
239
238
out_unlock :
240
- if (unlikely (r < 0 ))
241
- dev_err (adev -> dev , "failed to clear page "
242
- "tables on GEM object close (%ld)\n" , r );
243
- ttm_eu_backoff_reservation (& ticket , & list );
239
+ if (r )
240
+ dev_err (adev -> dev , "leaking bo va (%ld)\n" , r );
241
+ drm_exec_fini (& exec );
244
242
}
245
243
246
244
static int amdgpu_gem_object_mmap (struct drm_gem_object * obj , struct vm_area_struct * vma )
@@ -675,10 +673,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
675
673
struct amdgpu_fpriv * fpriv = filp -> driver_priv ;
676
674
struct amdgpu_bo * abo ;
677
675
struct amdgpu_bo_va * bo_va ;
678
- struct amdgpu_bo_list_entry vm_pd ;
679
- struct ttm_validate_buffer tv ;
680
- struct ww_acquire_ctx ticket ;
681
- struct list_head list , duplicates ;
676
+ struct drm_exec exec ;
682
677
uint64_t va_flags ;
683
678
uint64_t vm_size ;
684
679
int r = 0 ;
@@ -728,36 +723,38 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
728
723
return - EINVAL ;
729
724
}
730
725
731
- INIT_LIST_HEAD (& list );
732
- INIT_LIST_HEAD (& duplicates );
733
726
if ((args -> operation != AMDGPU_VA_OP_CLEAR ) &&
734
727
!(args -> flags & AMDGPU_VM_PAGE_PRT )) {
735
728
gobj = drm_gem_object_lookup (filp , args -> handle );
736
729
if (gobj == NULL )
737
730
return - ENOENT ;
738
731
abo = gem_to_amdgpu_bo (gobj );
739
- tv .bo = & abo -> tbo ;
740
- if (abo -> flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID )
741
- tv .num_shared = 1 ;
742
- else
743
- tv .num_shared = 0 ;
744
- list_add (& tv .head , & list );
745
732
} else {
746
733
gobj = NULL ;
747
734
abo = NULL ;
748
735
}
749
736
750
- amdgpu_vm_get_pd_bo (& fpriv -> vm , & list , & vm_pd );
737
+ drm_exec_init (& exec , DRM_EXEC_INTERRUPTIBLE_WAIT |
738
+ DRM_EXEC_IGNORE_DUPLICATES );
739
+ drm_exec_until_all_locked (& exec ) {
740
+ if (gobj ) {
741
+ r = drm_exec_lock_obj (& exec , gobj );
742
+ drm_exec_retry_on_contention (& exec );
743
+ if (unlikely (r ))
744
+ goto error ;
745
+ }
751
746
752
- r = ttm_eu_reserve_buffers (& ticket , & list , true, & duplicates );
753
- if (r )
754
- goto error_unref ;
747
+ r = amdgpu_vm_lock_pd (& fpriv -> vm , & exec , 2 );
748
+ drm_exec_retry_on_contention (& exec );
749
+ if (unlikely (r ))
750
+ goto error ;
751
+ }
755
752
756
753
if (abo ) {
757
754
bo_va = amdgpu_vm_bo_find (& fpriv -> vm , abo );
758
755
if (!bo_va ) {
759
756
r = - ENOENT ;
760
- goto error_backoff ;
757
+ goto error ;
761
758
}
762
759
} else if (args -> operation != AMDGPU_VA_OP_CLEAR ) {
763
760
bo_va = fpriv -> prt_va ;
@@ -794,10 +791,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
794
791
amdgpu_gem_va_update_vm (adev , & fpriv -> vm , bo_va ,
795
792
args -> operation );
796
793
797
- error_backoff :
798
- ttm_eu_backoff_reservation (& ticket , & list );
799
-
800
- error_unref :
794
+ error :
795
+ drm_exec_fini (& exec );
801
796
drm_gem_object_put (gobj );
802
797
return r ;
803
798
}
0 commit comments