Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christian König and committed by
Alex Deucher
d3aab672 59fd27cd

+12 -20
+12 -20
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 2262 2262 { 2263 2263 const unsigned align = min(AMDGPU_VM_PTB_ALIGN_SIZE, 2264 2264 AMDGPU_VM_PTE_COUNT(adev) * 8); 2265 + uint64_t init_pde_value = 0, flags; 2265 2266 unsigned ring_instance; 2266 2267 struct amdgpu_ring *ring; 2267 2268 struct drm_sched_rq *rq; 2269 + unsigned long size; 2268 2270 int r, i; 2269 - u64 flags; 2270 - uint64_t init_pde_value = 0; 2271 2271 2272 2272 vm->va = RB_ROOT_CACHED; 2273 2273 for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) ··· 2318 2318 flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS | 2319 2319 AMDGPU_GEM_CREATE_SHADOW); 2320 2320 2321 - r = amdgpu_bo_create(adev, 2322 - amdgpu_vm_bo_size(adev, adev->vm_manager.root_level), 2323 - align, true, 2324 - AMDGPU_GEM_DOMAIN_VRAM, 2325 - flags, 2326 - NULL, NULL, init_pde_value, &vm->root.base.bo); 2321 + size = amdgpu_vm_bo_size(adev, adev->vm_manager.root_level); 2322 + r = amdgpu_bo_create(adev, size, align, true, AMDGPU_GEM_DOMAIN_VRAM, 2323 + flags, NULL, NULL, init_pde_value, 2324 + &vm->root.base.bo); 2327 2325 if (r) 2328 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 2332 vm->root.base.vm = vm; 2331 2333 list_add_tail(&vm->root.base.bo_list, &vm->root.base.bo->va); 2332 - INIT_LIST_HEAD(&vm->root.base.vm_status); 2333 - 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 - } 2334 + list_add_tail(&vm->root.base.vm_status, &vm->evicted); 2335 + amdgpu_bo_unreserve(vm->root.base.bo); 2344 2336 2345 2337 if (pasid) { 2346 2338 unsigned long flags;