aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-08-24 06:32:55 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-08-29 15:27:56 -0400
commit34d7be5dc28041b95254da517fd0f0f740544ece (patch)
tree3cb6ab57a8e2e59347216a2daf24e93068c6c3e2 /drivers/gpu/drm/amd
parent87f64a76b38acaa081b2bc46c3169884b9ccd6f2 (diff)
drm/amdgpu: fix and cleanup VM ready check
Stop checking the mapped BO itself, cause that one is certainly not a page table. Additional to that move the code into amdgpu_vm.c Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c33
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c32
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h1
3 files changed, 35 insertions, 31 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 7171968f261e..9b1b6bdd4841 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -127,35 +127,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj,
127 return 0; 127 return 0;
128} 128}
129 129
130static int amdgpu_gem_vm_check(void *param, struct amdgpu_bo *bo)
131{
132 /* if anything is swapped out don't swap it in here,
133 just abort and wait for the next CS */
134 if (!amdgpu_bo_gpu_accessible(bo))
135 return -ERESTARTSYS;
136
137 if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
138 return -ERESTARTSYS;
139
140 return 0;
141}
142
143static bool amdgpu_gem_vm_ready(struct amdgpu_device *adev,
144 struct amdgpu_vm *vm,
145 struct list_head *list)
146{
147 struct ttm_validate_buffer *entry;
148
149 list_for_each_entry(entry, list, head) {
150 struct amdgpu_bo *bo =
151 container_of(entry->bo, struct amdgpu_bo, tbo);
152 if (amdgpu_gem_vm_check(NULL, bo))
153 return false;
154 }
155
156 return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_vm_check, NULL);
157}
158
159void amdgpu_gem_object_close(struct drm_gem_object *obj, 130void amdgpu_gem_object_close(struct drm_gem_object *obj,
160 struct drm_file *file_priv) 131 struct drm_file *file_priv)
161{ 132{
@@ -189,7 +160,7 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
189 if (bo_va && --bo_va->ref_count == 0) { 160 if (bo_va && --bo_va->ref_count == 0) {
190 amdgpu_vm_bo_rmv(adev, bo_va); 161 amdgpu_vm_bo_rmv(adev, bo_va);
191 162
192 if (amdgpu_gem_vm_ready(adev, vm, &list)) { 163 if (amdgpu_vm_ready(adev, vm)) {
193 struct dma_fence *fence = NULL; 164 struct dma_fence *fence = NULL;
194 165
195 r = amdgpu_vm_clear_freed(adev, vm, &fence); 166 r = amdgpu_vm_clear_freed(adev, vm, &fence);
@@ -513,7 +484,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
513{ 484{
514 int r = -ERESTARTSYS; 485 int r = -ERESTARTSYS;
515 486
516 if (!amdgpu_gem_vm_ready(adev, vm, list)) 487 if (!amdgpu_vm_ready(adev, vm))
517 goto error; 488 goto error;
518 489
519 r = amdgpu_vm_update_directories(adev, vm); 490 r = amdgpu_vm_update_directories(adev, vm);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index db63ff5c80f2..67c37b22f8ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -232,6 +232,38 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
232} 232}
233 233
234/** 234/**
235 * amdgpu_vm_check - helper for amdgpu_vm_ready
236 */
237static int amdgpu_vm_check(void *param, struct amdgpu_bo *bo)
238{
239 /* if anything is swapped out don't swap it in here,
240 just abort and wait for the next CS */
241 if (!amdgpu_bo_gpu_accessible(bo))
242 return -ERESTARTSYS;
243
244 if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
245 return -ERESTARTSYS;
246
247 return 0;
248}
249
250/**
251 * amdgpu_vm_ready - check VM is ready for updates
252 *
253 * @adev: amdgpu device
254 * @vm: VM to check
255 *
256 * Check if all VM PDs/PTs are ready for updates
257 */
258bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm)
259{
260 if (amdgpu_vm_check(NULL, vm->root.bo))
261 return false;
262
263 return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_vm_check, NULL);
264}
265
266/**
235 * amdgpu_vm_alloc_levels - allocate the PD/PT levels 267 * amdgpu_vm_alloc_levels - allocate the PD/PT levels
236 * 268 *
237 * @adev: amdgpu_device pointer 269 * @adev: amdgpu_device pointer
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index ba6691b58ee7..9347d28c3c1e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -225,6 +225,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
225void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, 225void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm,
226 struct list_head *validated, 226 struct list_head *validated,
227 struct amdgpu_bo_list_entry *entry); 227 struct amdgpu_bo_list_entry *entry);
228bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm);
228int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, 229int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
229 int (*callback)(void *p, struct amdgpu_bo *bo), 230 int (*callback)(void *p, struct amdgpu_bo *bo),
230 void *param); 231 void *param);