diff options
author | Christian König <christian.koenig@amd.com> | 2018-01-24 08:57:02 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-01-29 23:15:26 -0500 |
commit | d3aab672de4902ce25e9858fbb5bf67e8254b23c (patch) | |
tree | ad6d9053e07263e6eaecd4d73c55989d3bd6f8df /drivers/gpu/drm/amd/amdgpu | |
parent | 59fd27cd2fd762b08a1f54de8bbe3b82aba06a13 (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')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 32 |
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; |