aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-01-24 08:57:02 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-01-29 23:15:26 -0500
commitd3aab672de4902ce25e9858fbb5bf67e8254b23c (patch)
treead6d9053e07263e6eaecd4d73c55989d3bd6f8df /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
parent59fd27cd2fd762b08a1f54de8bbe3b82aba06a13 (diff)
drm/amdgpu: fix another potential cause of VM faults
The root PD can be evicted directly after allocating it, just validate it on first use. Signed-off-by: Christian König <christian.koenig@amd.com> Acked-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 6fc16eecf2dc..5afbc5e714d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2262,12 +2262,12 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
2262{ 2262{
2263 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, 2263 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE,
2264 AMDGPU_VM_PTE_COUNT(adev) * 8); 2264 AMDGPU_VM_PTE_COUNT(adev) * 8);
2265 uint64_t init_pde_value = 0, flags;
2265 unsigned ring_instance; 2266 unsigned ring_instance;
2266 struct amdgpu_ring *ring; 2267 struct amdgpu_ring *ring;
2267 struct drm_sched_rq *rq; 2268 struct drm_sched_rq *rq;
2269 unsigned long size;
2268 int r, i; 2270 int r, i;
2269 u64 flags;
2270 uint64_t init_pde_value = 0;
2271 2271
2272 vm->va = RB_ROOT_CACHED; 2272 vm->va = RB_ROOT_CACHED;
2273 for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) 2273 for (i = 0; i < AMDGPU_MAX_VMHUBS; i++)
@@ -2318,29 +2318,21 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
2318 flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS | 2318 flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
2319 AMDGPU_GEM_CREATE_SHADOW); 2319 AMDGPU_GEM_CREATE_SHADOW);
2320 2320
2321 r = amdgpu_bo_create(adev, 2321 size = amdgpu_vm_bo_size(adev, adev->vm_manager.root_level);
2322 amdgpu_vm_bo_size(adev, adev->vm_manager.root_level), 2322 r = amdgpu_bo_create(adev, size, align, true, AMDGPU_GEM_DOMAIN_VRAM,
2323 align, true, 2323 flags, NULL, NULL, init_pde_value,
2324 AMDGPU_GEM_DOMAIN_VRAM, 2324 &vm->root.base.bo);
2325 flags,
2326 NULL, NULL, init_pde_value, &vm->root.base.bo);
2327 if (r) 2325 if (r)
2328 goto error_free_sched_entity; 2326 goto error_free_sched_entity;
2329 2327
2328 r = amdgpu_bo_reserve(vm->root.base.bo, true);
2329 if (r)
2330 goto error_free_root;
2331
2330 vm->root.base.vm = vm; 2332 vm->root.base.vm = vm;
2331 list_add_tail(&vm->root.base.bo_list, &vm->root.base.bo->va); 2333 list_add_tail(&vm->root.base.bo_list, &vm->root.base.bo->va);
2332 INIT_LIST_HEAD(&vm->root.base.vm_status); 2334 list_add_tail(&vm->root.base.vm_status, &vm->evicted);
2333 2335 amdgpu_bo_unreserve(vm->root.base.bo);
2334 if (vm->use_cpu_for_update) {
2335 r = amdgpu_bo_reserve(vm->root.base.bo, false);
2336 if (r)
2337 goto error_free_root;
2338
2339 r = amdgpu_bo_kmap(vm->root.base.bo, NULL);
2340 amdgpu_bo_unreserve(vm->root.base.bo);
2341 if (r)
2342 goto error_free_root;
2343 }
2344 2336
2345 if (pasid) { 2337 if (pasid) {
2346 unsigned long flags; 2338 unsigned long flags;