diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch new file mode 100644 index 00000000..22576ef8 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch @@ -0,0 +1,98 @@ +From 2d3e552bc1d8e8dc0bbd8daff45afb1512d9dcdb Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +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 <Felix.Kuehling@amd.com> +--- + 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 + |