Skip to content

Commit 8a20668

Browse files
drm/amdgpu: use drm_exec for GEM and CSA handling v2
Start using the new component here as well. v2: ignore duplicates to allow per VM BO mappings 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 8abc1eb commit 8a20668

File tree

2 files changed

+72
-87
lines changed

2 files changed

+72
-87
lines changed

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

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
* * Author: [email protected]
2323
*/
2424

25+
#include <drm/drm_exec.h>
26+
2527
#include "amdgpu.h"
2628

2729
uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev)
@@ -65,31 +67,25 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
6567
struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,
6668
uint64_t csa_addr, uint32_t size)
6769
{
68-
struct ww_acquire_ctx ticket;
69-
struct list_head list;
70-
struct amdgpu_bo_list_entry pd;
71-
struct ttm_validate_buffer csa_tv;
70+
struct drm_exec exec;
7271
int r;
7372

74-
INIT_LIST_HEAD(&list);
75-
INIT_LIST_HEAD(&csa_tv.head);
76-
csa_tv.bo = &bo->tbo;
77-
csa_tv.num_shared = 1;
78-
79-
list_add(&csa_tv.head, &list);
80-
amdgpu_vm_get_pd_bo(vm, &list, &pd);
81-
82-
r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
83-
if (r) {
84-
DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
85-
return r;
73+
drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
74+
drm_exec_until_all_locked(&exec) {
75+
r = amdgpu_vm_lock_pd(vm, &exec, 0);
76+
if (likely(!r))
77+
r = drm_exec_lock_obj(&exec, &bo->tbo.base);
78+
drm_exec_retry_on_contention(&exec);
79+
if (unlikely(r)) {
80+
DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
81+
goto error;
82+
}
8683
}
8784

8885
*bo_va = amdgpu_vm_bo_add(adev, vm, bo);
8986
if (!*bo_va) {
90-
ttm_eu_backoff_reservation(&ticket, &list);
91-
DRM_ERROR("failed to create bo_va for static CSA\n");
92-
return -ENOMEM;
87+
r = -ENOMEM;
88+
goto error;
9389
}
9490

9591
r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size,
@@ -99,48 +95,42 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
9995
if (r) {
10096
DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);
10197
amdgpu_vm_bo_del(adev, *bo_va);
102-
ttm_eu_backoff_reservation(&ticket, &list);
103-
return r;
98+
goto error;
10499
}
105100

106-
ttm_eu_backoff_reservation(&ticket, &list);
107-
return 0;
101+
error:
102+
drm_exec_fini(&exec);
103+
return r;
108104
}
109105

110106
int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
111107
struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va,
112108
uint64_t csa_addr)
113109
{
114-
struct ww_acquire_ctx ticket;
115-
struct list_head list;
116-
struct amdgpu_bo_list_entry pd;
117-
struct ttm_validate_buffer csa_tv;
110+
struct drm_exec exec;
118111
int r;
119112

120-
INIT_LIST_HEAD(&list);
121-
INIT_LIST_HEAD(&csa_tv.head);
122-
csa_tv.bo = &bo->tbo;
123-
csa_tv.num_shared = 1;
124-
125-
list_add(&csa_tv.head, &list);
126-
amdgpu_vm_get_pd_bo(vm, &list, &pd);
127-
128-
r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
129-
if (r) {
130-
DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
131-
return r;
113+
drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT);
114+
drm_exec_until_all_locked(&exec) {
115+
r = amdgpu_vm_lock_pd(vm, &exec, 0);
116+
if (likely(!r))
117+
r = drm_exec_lock_obj(&exec, &bo->tbo.base);
118+
drm_exec_retry_on_contention(&exec);
119+
if (unlikely(r)) {
120+
DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
121+
goto error;
122+
}
132123
}
133124

134125
r = amdgpu_vm_bo_unmap(adev, bo_va, csa_addr);
135126
if (r) {
136127
DRM_ERROR("failed to do bo_unmap on static CSA, err=%d\n", r);
137-
ttm_eu_backoff_reservation(&ticket, &list);
138-
return r;
128+
goto error;
139129
}
140130

141131
amdgpu_vm_bo_del(adev, bo_va);
142132

143-
ttm_eu_backoff_reservation(&ticket, &list);
144-
145-
return 0;
133+
error:
134+
drm_exec_fini(&exec);
135+
return r;
146136
}

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

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include <drm/amdgpu_drm.h>
3535
#include <drm/drm_drv.h>
36+
#include <drm/drm_exec.h>
3637
#include <drm/drm_gem_ttm_helper.h>
3738
#include <drm/ttm/ttm_tt.h>
3839

@@ -198,29 +199,24 @@ static void amdgpu_gem_object_close(struct drm_gem_object *obj,
198199
struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
199200
struct amdgpu_vm *vm = &fpriv->vm;
200201

201-
struct amdgpu_bo_list_entry vm_pd;
202-
struct list_head list, duplicates;
203202
struct dma_fence *fence = NULL;
204-
struct ttm_validate_buffer tv;
205-
struct ww_acquire_ctx ticket;
206203
struct amdgpu_bo_va *bo_va;
204+
struct drm_exec exec;
207205
long r;
208206

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;
223218
}
219+
224220
bo_va = amdgpu_vm_bo_find(vm, bo);
225221
if (!bo_va || --bo_va->ref_count)
226222
goto out_unlock;
@@ -230,17 +226,19 @@ static void amdgpu_gem_object_close(struct drm_gem_object *obj,
230226
goto out_unlock;
231227

232228
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);
233232
if (r || !fence)
234233
goto out_unlock;
235234

236235
amdgpu_bo_fence(bo, fence, true);
237236
dma_fence_put(fence);
238237

239238
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);
244242
}
245243

246244
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,
675673
struct amdgpu_fpriv *fpriv = filp->driver_priv;
676674
struct amdgpu_bo *abo;
677675
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;
682677
uint64_t va_flags;
683678
uint64_t vm_size;
684679
int r = 0;
@@ -728,36 +723,38 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
728723
return -EINVAL;
729724
}
730725

731-
INIT_LIST_HEAD(&list);
732-
INIT_LIST_HEAD(&duplicates);
733726
if ((args->operation != AMDGPU_VA_OP_CLEAR) &&
734727
!(args->flags & AMDGPU_VM_PAGE_PRT)) {
735728
gobj = drm_gem_object_lookup(filp, args->handle);
736729
if (gobj == NULL)
737730
return -ENOENT;
738731
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);
745732
} else {
746733
gobj = NULL;
747734
abo = NULL;
748735
}
749736

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+
}
751746

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+
}
755752

756753
if (abo) {
757754
bo_va = amdgpu_vm_bo_find(&fpriv->vm, abo);
758755
if (!bo_va) {
759756
r = -ENOENT;
760-
goto error_backoff;
757+
goto error;
761758
}
762759
} else if (args->operation != AMDGPU_VA_OP_CLEAR) {
763760
bo_va = fpriv->prt_va;
@@ -794,10 +791,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
794791
amdgpu_gem_va_update_vm(adev, &fpriv->vm, bo_va,
795792
args->operation);
796793

797-
error_backoff:
798-
ttm_eu_backoff_reservation(&ticket, &list);
799-
800-
error_unref:
794+
error:
795+
drm_exec_fini(&exec);
801796
drm_gem_object_put(gobj);
802797
return r;
803798
}

0 commit comments

Comments
 (0)