From 2d3e552bc1d8e8dc0bbd8daff45afb1512d9dcdb Mon Sep 17 00:00:00 2001 From: Felix Kuehling Date: Fri, 23 Feb 2018 20:20:16 -0500 Subject: [PATCH 3710/4131] drm/amdgpu: Fix initial validation of PD BO for KFD VMs Make sure the PD BO is valid and attach the eviction fence during VM creation. This ensures that the pd_phys_address is actually valid and an eviction that would invalidate it triggers a KFD process eviction like it should. Change-Id: Ia0733c9e16aa00bfa0d20fd0a8cfc108c59c1852 Signed-off-by: Felix Kuehling --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 30 ++++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 0b343eb..998cab1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -356,21 +356,15 @@ static int amdgpu_amdkfd_validate(void *param, struct amdgpu_bo *bo) return amdgpu_amdkfd_bo_validate(bo, p->domain, p->wait); } -static u64 get_vm_pd_gpu_offset(struct amdgpu_vm *vm, bool reserve) +static u64 get_vm_pd_gpu_offset(struct amdgpu_vm *vm) { struct amdgpu_device *adev = amdgpu_ttm_adev(vm->root.base.bo->tbo.bdev); u64 offset; uint64_t flags = AMDGPU_PTE_VALID; - if (reserve) - amdgpu_bo_reserve(vm->root.base.bo, false); - offset = amdgpu_bo_gpu_offset(vm->root.base.bo); - if (reserve) - amdgpu_bo_unreserve(vm->root.base.bo); - /* On some ASICs the FB doesn't start at 0. Adjust FB offset * to an actual MC address. */ @@ -409,7 +403,7 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm) return ret; } - vm->pd_phys_addr = get_vm_pd_gpu_offset(vm, false); + vm->pd_phys_addr = get_vm_pd_gpu_offset(vm); if (vm->use_cpu_for_update) { ret = amdgpu_bo_kmap(pd, NULL); @@ -990,7 +984,7 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, { int ret; struct amdgpu_vm *new_vm; - struct amdkfd_process_info *info; + struct amdkfd_process_info *info = NULL; struct amdgpu_device *adev = get_amdgpu_device(kgd); new_vm = kzalloc(sizeof(*new_vm), GFP_KERNEL); @@ -1036,8 +1030,21 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, } new_vm->process_info = *process_info; - new_vm->pd_phys_addr = get_vm_pd_gpu_offset(new_vm, true); + /* Validate page directory and attach eviction fence */ + ret = amdgpu_bo_reserve(new_vm->root.base.bo, true); + if (ret) + goto reserve_pd_fail; + ret = vm_validate_pt_pd_bos(new_vm); + if (ret) { + pr_err("validate_pt_pd_bos() failed\n"); + goto validate_pd_fail; + } + amdgpu_bo_fence(new_vm->root.base.bo, + &new_vm->process_info->eviction_fence->base, true); + amdgpu_bo_unreserve(new_vm->root.base.bo); + + /* Update process info */ mutex_lock(&new_vm->process_info->lock); list_add_tail(&new_vm->vm_list_node, &(new_vm->process_info->vm_list_head)); @@ -1050,6 +1057,9 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm, return ret; +validate_pd_fail: + amdgpu_bo_unreserve(new_vm->root.base.bo); +reserve_pd_fail: create_evict_fence_fail: kfree(info); alloc_process_info_fail: -- 2.7.4