Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 2acc73f

Browse files
drm/amdgpu: use drm_exec for MES testing
Start using the new component here as well. Signed-off-by: Christian König <[email protected]> Acked-by: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 8a20668 commit 2acc73f

File tree

1 file changed

+43
-47
lines changed

1 file changed

+43
-47
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
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,
12881284
out_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

Comments
 (0)