2222 */
2323
2424#include <linux/firmware.h>
25+ #include <drm/drm_exec.h>
2526
2627#include "amdgpu_mes.h"
2728#include "amdgpu.h"
@@ -1168,34 +1169,31 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,
11681169 struct amdgpu_mes_ctx_data * ctx_data )
11691170{
11701171 struct amdgpu_bo_va * bo_va ;
1171- struct ww_acquire_ctx ticket ;
1172- struct list_head list ;
1173- struct amdgpu_bo_list_entry pd ;
1174- struct ttm_validate_buffer csa_tv ;
11751172 struct amdgpu_sync sync ;
1173+ struct drm_exec exec ;
11761174 int r ;
11771175
11781176 amdgpu_sync_create (& sync );
1179- INIT_LIST_HEAD (& list );
1180- INIT_LIST_HEAD (& csa_tv .head );
11811177
1182- csa_tv .bo = & ctx_data -> meta_data_obj -> tbo ;
1183- csa_tv .num_shared = 1 ;
1184-
1185- list_add (& csa_tv .head , & list );
1186- amdgpu_vm_get_pd_bo (vm , & list , & pd );
1187-
1188- r = ttm_eu_reserve_buffers (& ticket , & list , true, NULL );
1189- if (r ) {
1190- DRM_ERROR ("failed to reserve meta data BO: err=%d\n" , r );
1191- return r ;
1178+ drm_exec_init (& exec , 0 );
1179+ drm_exec_until_all_locked (& exec ) {
1180+ r = drm_exec_lock_obj (& exec ,
1181+ & ctx_data -> meta_data_obj -> tbo .base );
1182+ drm_exec_retry_on_contention (& exec );
1183+ if (unlikely (r ))
1184+ goto error_fini_exec ;
1185+
1186+ r = amdgpu_vm_lock_pd (vm , & exec , 0 );
1187+ drm_exec_retry_on_contention (& exec );
1188+ if (unlikely (r ))
1189+ goto error_fini_exec ;
11921190 }
11931191
11941192 bo_va = amdgpu_vm_bo_add (adev , vm , ctx_data -> meta_data_obj );
11951193 if (!bo_va ) {
1196- ttm_eu_backoff_reservation (& ticket , & list );
11971194 DRM_ERROR ("failed to create bo_va for meta data BO\n" );
1198- return - ENOMEM ;
1195+ r = - ENOMEM ;
1196+ goto error_fini_exec ;
11991197 }
12001198
12011199 r = amdgpu_vm_bo_map (adev , bo_va , ctx_data -> meta_data_gpu_addr , 0 ,
@@ -1205,33 +1203,35 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,
12051203
12061204 if (r ) {
12071205 DRM_ERROR ("failed to do bo_map on meta data, err=%d\n" , r );
1208- goto error ;
1206+ goto error_del_bo_va ;
12091207 }
12101208
12111209 r = amdgpu_vm_bo_update (adev , bo_va , false);
12121210 if (r ) {
12131211 DRM_ERROR ("failed to do vm_bo_update on meta data\n" );
1214- goto error ;
1212+ goto error_del_bo_va ;
12151213 }
12161214 amdgpu_sync_fence (& sync , bo_va -> last_pt_update );
12171215
12181216 r = amdgpu_vm_update_pdes (adev , vm , false);
12191217 if (r ) {
12201218 DRM_ERROR ("failed to update pdes on meta data\n" );
1221- goto error ;
1219+ goto error_del_bo_va ;
12221220 }
12231221 amdgpu_sync_fence (& sync , vm -> last_update );
12241222
12251223 amdgpu_sync_wait (& sync , false);
1226- ttm_eu_backoff_reservation ( & ticket , & list );
1224+ drm_exec_fini ( & exec );
12271225
12281226 amdgpu_sync_free (& sync );
12291227 ctx_data -> meta_data_va = bo_va ;
12301228 return 0 ;
12311229
1232- error :
1230+ error_del_bo_va :
12331231 amdgpu_vm_bo_del (adev , bo_va );
1234- ttm_eu_backoff_reservation (& ticket , & list );
1232+
1233+ error_fini_exec :
1234+ drm_exec_fini (& exec );
12351235 amdgpu_sync_free (& sync );
12361236 return r ;
12371237}
@@ -1242,34 +1242,30 @@ int amdgpu_mes_ctx_unmap_meta_data(struct amdgpu_device *adev,
12421242 struct amdgpu_bo_va * bo_va = ctx_data -> meta_data_va ;
12431243 struct amdgpu_bo * bo = ctx_data -> meta_data_obj ;
12441244 struct amdgpu_vm * vm = bo_va -> base .vm ;
1245- struct amdgpu_bo_list_entry vm_pd ;
1246- struct list_head list , duplicates ;
1247- struct dma_fence * fence = NULL ;
1248- struct ttm_validate_buffer tv ;
1249- struct ww_acquire_ctx ticket ;
1250- long r = 0 ;
1251-
1252- INIT_LIST_HEAD (& list );
1253- INIT_LIST_HEAD (& duplicates );
1254-
1255- tv .bo = & bo -> tbo ;
1256- tv .num_shared = 2 ;
1257- list_add (& tv .head , & list );
1258-
1259- amdgpu_vm_get_pd_bo (vm , & list , & vm_pd );
1260-
1261- r = ttm_eu_reserve_buffers (& ticket , & list , false, & duplicates );
1262- if (r ) {
1263- dev_err (adev -> dev , "leaking bo va because "
1264- "we fail to reserve bo (%ld)\n" , r );
1265- return r ;
1245+ struct dma_fence * fence ;
1246+ struct drm_exec exec ;
1247+ long r ;
1248+
1249+ drm_exec_init (& exec , 0 );
1250+ drm_exec_until_all_locked (& exec ) {
1251+ r = drm_exec_lock_obj (& exec ,
1252+ & ctx_data -> meta_data_obj -> tbo .base );
1253+ drm_exec_retry_on_contention (& exec );
1254+ if (unlikely (r ))
1255+ goto out_unlock ;
1256+
1257+ r = amdgpu_vm_lock_pd (vm , & exec , 0 );
1258+ drm_exec_retry_on_contention (& exec );
1259+ if (unlikely (r ))
1260+ goto out_unlock ;
12661261 }
12671262
12681263 amdgpu_vm_bo_del (adev , bo_va );
12691264 if (!amdgpu_vm_ready (vm ))
12701265 goto out_unlock ;
12711266
1272- r = dma_resv_get_singleton (bo -> tbo .base .resv , DMA_RESV_USAGE_BOOKKEEP , & fence );
1267+ r = dma_resv_get_singleton (bo -> tbo .base .resv , DMA_RESV_USAGE_BOOKKEEP ,
1268+ & fence );
12731269 if (r )
12741270 goto out_unlock ;
12751271 if (fence ) {
@@ -1288,7 +1284,7 @@ int amdgpu_mes_ctx_unmap_meta_data(struct amdgpu_device *adev,
12881284out_unlock :
12891285 if (unlikely (r < 0 ))
12901286 dev_err (adev -> dev , "failed to clear page tables (%ld)\n" , r );
1291- ttm_eu_backoff_reservation ( & ticket , & list );
1287+ drm_exec_fini ( & exec );
12921288
12931289 return r ;
12941290}
0 commit comments