aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch
new file mode 100644
index 00000000..6c3fcb01
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1513-drm-amdkgd-Keep-kgd_mem-validation-list-in-amdkfd_vm.patch
@@ -0,0 +1,125 @@
+From 3f86e7d5fc64822e35dec1db86d12be69c68a2bb Mon Sep 17 00:00:00 2001
+From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+Date: Mon, 27 Jun 2016 18:00:13 -0400
+Subject: [PATCH 1513/4131] drm/amdkgd: Keep kgd_mem validation list in
+ amdkfd_vm
+
+For KFD memory eviction / restore, all the KFD process BOs needs to be
+atomically reserved. So keep the list of kgd_mem in amdkfd_vm readily
+available.
+
+Change-Id: Ice91c2d481f934f76b7d2de42606df744db94b7d
+Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 31 +++++++++++++++++++++++-
+ 2 files changed, 31 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index c0fdf52..1ee31f9 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -53,6 +53,7 @@ struct kgd_mem {
+ struct mutex lock;
+ struct amdgpu_bo *bo;
+ struct list_head bo_va_list;
++ struct amdgpu_bo_list_entry bo_list_entry;
+ uint32_t domain;
+ unsigned int mapped_to_gpu_memory;
+ void *kptr;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index edf1a6a..60bbcfe 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -290,6 +290,21 @@ static int amdgpu_amdkfd_gpuvm_clear_bo(struct amdgpu_device *adev,
+ return r;
+ }
+
++static void add_kgd_mem_to_kfd_bo_list(struct kgd_mem *mem,
++ struct amdkfd_vm *kfd_vm)
++{
++ struct amdgpu_bo_list_entry *entry = &mem->data2.bo_list_entry;
++ struct amdgpu_bo *bo = mem->data2.bo;
++
++ entry->robj = bo;
++ INIT_LIST_HEAD(&entry->tv.head);
++ entry->tv.shared = true;
++ entry->tv.bo = &bo->tbo;
++ mutex_lock(&kfd_vm->master->lock);
++ list_add_tail(&entry->tv.head, &kfd_vm->master->kfd_bo_list);
++ mutex_unlock(&kfd_vm->master->lock);
++}
++
+ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
+ uint64_t size, void *vm, struct kgd_mem **mem,
+ uint64_t *offset, void **kptr, struct kfd_process_device *pdd,
+@@ -302,11 +317,12 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
+ uint64_t user_addr = 0;
+ int byte_align;
+ u32 alloc_domain;
++ struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm;
+
+ BUG_ON(kgd == NULL);
+ BUG_ON(size == 0);
+ BUG_ON(mem == NULL);
+- BUG_ON(vm == NULL);
++ BUG_ON(kfd_vm == NULL);
+
+ if (aql_queue)
+ size = size >> 1;
+@@ -416,6 +432,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
+ (*mem)->data2.va = va;
+ (*mem)->data2.domain = domain;
+ (*mem)->data2.mapped_to_gpu_memory = 0;
++ add_kgd_mem_to_kfd_bo_list(*mem, kfd_vm);
+
+ if (offset)
+ *offset = amdgpu_bo_mmap_offset(bo);
+@@ -867,11 +884,16 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
+ struct kfd_bo_va_list *entry, *tmp;
+ struct bo_vm_reservation_context ctx;
+ int ret;
++ struct amdgpu_bo_list_entry *bo_list_entry;
++ struct amdkfd_vm *master_vm;
+
+ BUG_ON(kgd == NULL);
+ BUG_ON(mem == NULL);
++ BUG_ON(vm == NULL);
+
+ adev = get_amdgpu_device(kgd);
++ master_vm = ((struct amdkfd_vm *)vm)->master;
++ BUG_ON(master_vm == NULL);
+
+ mutex_lock(&mem->data2.lock);
+
+@@ -916,6 +938,11 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
+ }
+
+ /* Free the BO*/
++ bo_list_entry = &mem->data2.bo_list_entry;
++ mutex_lock(&master_vm->lock);
++ list_del(&bo_list_entry->tv.head);
++ mutex_unlock(&master_vm->lock);
++
+ amdgpu_bo_unref(&mem->data2.bo);
+ kfree(mem);
+
+@@ -1476,6 +1503,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
+ struct drm_gem_object *obj;
+ struct amdgpu_bo *bo;
+ int r = 0;
++ struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm;
+
+ dma_buf = dma_buf_get(dma_buf_fd);
+ if (IS_ERR(dma_buf))
+@@ -1515,6 +1543,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
+ (*mem)->data2.domain = (bo->prefered_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
+ AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT;
+ (*mem)->data2.mapped_to_gpu_memory = 0;
++ add_kgd_mem_to_kfd_bo_list(*mem, kfd_vm);
+
+ out_put:
+ dma_buf_put(dma_buf);
+--
+2.7.4
+