aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3710-drm-amdgpu-Fix-initial-validation-of-PD-BO-for-KFD-V.patch
diff options
context:
space:
mode:
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.patch98
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
+