aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch
new file mode 100644
index 00000000..8d8fd135
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2684-drm-amdkfd-Release-an-acquired-process-vm.patch
@@ -0,0 +1,176 @@
+From 6411f0b206f066fa13f007d1acc1b0604d49afd8 Mon Sep 17 00:00:00 2001
+From: Oak Zeng <Oak.Zeng@amd.com>
+Date: Mon, 27 Aug 2018 15:18:36 -0400
+Subject: [PATCH 2684/2940] drm/amdkfd: Release an acquired process vm
+
+For compute vm acquired from amdgpu, vm.pasid is managed
+by kfd. Decouple pasid from such vm on process destroy
+to avoid duplicate pasid release.
+
+Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 1 +
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 +
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 1 +
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 19 ++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 20 +++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 +
+ drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 +++-
+ .../gpu/drm/amd/include/kgd_kfd_interface.h | 1 +
+ 9 files changed, 48 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index 91c28f94b77d..6e40de7bff8c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -171,6 +171,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
+ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
+ struct amdgpu_vm *vm);
+ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm);
++void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm);
+ uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm);
+ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+ struct kgd_dev *kgd, uint64_t va, uint64_t size,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+index b3aa4c7ef924..bfe78bb65e70 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -206,6 +206,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
+ .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
+ .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
++ .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
+ .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
+ .set_vm_context_page_table_base = set_vm_context_page_table_base,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+index 12a98f4940b0..af81c7d921f3 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -165,6 +165,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
+ .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
+ .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
++ .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
+ .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
+ .set_vm_context_page_table_base = set_vm_context_page_table_base,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+index a0c00b8276c3..a7129ac58639 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+@@ -202,6 +202,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
+ .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
+ .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
+ .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
++ .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
+ .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
+ .set_vm_context_page_table_base = set_vm_context_page_table_base,
+ .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index fb124a29be01..315cee608c77 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -1123,6 +1123,25 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm)
+ kfree(vm);
+ }
+
++void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm)
++{
++ struct amdgpu_device *adev = get_amdgpu_device(kgd);
++ struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;
++
++ if (WARN_ON(!kgd || !vm))
++ return;
++
++ pr_debug("Releasing process vm %p\n", vm);
++
++ /* The original pasid of amdgpu vm has already been
++ * released during making a amdgpu vm to a compute vm
++ * The current pasid is managed by kfd and will be
++ * released on kfd process destroy. Set amdgpu pasid
++ * to 0 to avoid duplicate release.
++ */
++ amdgpu_vm_release_compute(adev, avm);
++}
++
+ uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm)
+ {
+ struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 3e6a245e3781..1ce641b831eb 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -2833,6 +2833,26 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ return r;
+ }
+
++/**
++ * amdgpu_vm_release_compute - release a compute vm
++ * @adev: amdgpu_device pointer
++ * @vm: a vm turned into compute vm by calling amdgpu_vm_make_compute
++ *
++ * This is a correspondant of amdgpu_vm_make_compute. It decouples compute
++ * pasid from vm. Compute should stop use of vm after this call.
++ */
++void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
++{
++ if (vm->pasid) {
++ unsigned long flags;
++
++ spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
++ idr_remove(&adev->vm_manager.pasid_idr, vm->pasid);
++ spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
++ }
++ vm->pasid = 0;
++}
++
+ /**
+ * amdgpu_vm_fini - tear down a vm instance
+ *
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+index e3f0a1de69ab..a5cd3508d17c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+@@ -346,6 +346,7 @@ long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout);
+ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ int vm_context, unsigned int pasid);
+ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
++void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+ void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm,
+ struct list_head *validated,
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+index 4694386cc623..3ecb54e76281 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+@@ -322,8 +322,10 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
+ pr_debug("Releasing pdd (topology id %d) for process (pasid %d)\n",
+ pdd->dev->id, p->pasid);
+
+- if (pdd->drm_file)
++ if (pdd->drm_file) {
++ pdd->dev->kfd2kgd->release_process_vm(pdd->dev->kgd, pdd->vm);
+ fput(pdd->drm_file);
++ }
+ else if (pdd->vm)
+ pdd->dev->kfd2kgd->destroy_process_vm(
+ pdd->dev->kgd, pdd->vm);
+diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+index 43b82e14007e..a94e72df468f 100644
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -377,6 +377,7 @@ struct kfd2kgd_calls {
+ int (*acquire_process_vm)(struct kgd_dev *kgd, struct file *filp,
+ void **vm, void **process_info, struct dma_fence **ef);
+ void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
++ void (*release_process_vm)(struct kgd_dev *kgd, void *vm);
+ uint32_t (*get_process_page_dir)(void *vm);
+ void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
+ uint32_t vmid, uint32_t page_table_base);
+--
+2.17.1
+