diff options
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.patch | 176 |
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 + |