aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorOak Zeng <Oak.Zeng@amd.com>2018-08-27 15:18:36 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-08-29 13:35:00 -0400
commitbf47afbabf1cf149f9ebc8e1f7dab6913e360dc4 (patch)
treec199e1bcd080fa3878d025b5c419b8ecb172dd05 /drivers/gpu/drm/amd
parent1685b01a858872075bc258a350153de0c7e95404 (diff)
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>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_process.c4
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h1
9 files changed, 48 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index ba0057e94d5e..2a1da3fe2b06 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -172,6 +172,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
172void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, 172void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
173 struct amdgpu_vm *vm); 173 struct amdgpu_vm *vm);
174void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); 174void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm);
175void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm);
175uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); 176uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm);
176int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( 177int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
177 struct kgd_dev *kgd, uint64_t va, uint64_t size, 178 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 ea3f698aef5e..6f0b5267addb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -205,6 +205,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
205 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm, 205 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
206 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm, 206 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
207 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm, 207 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
208 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
208 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir, 209 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
209 .set_vm_context_page_table_base = set_vm_context_page_table_base, 210 .set_vm_context_page_table_base = set_vm_context_page_table_base,
210 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu, 211 .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 f6e53e9352bd..ea7c18ce7754 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -164,6 +164,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
164 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm, 164 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
165 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm, 165 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
166 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm, 166 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
167 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
167 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir, 168 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
168 .set_vm_context_page_table_base = set_vm_context_page_table_base, 169 .set_vm_context_page_table_base = set_vm_context_page_table_base,
169 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu, 170 .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 8efedfcb9dfc..3dc987cab0ea 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -201,6 +201,7 @@ static const struct kfd2kgd_calls kfd2kgd = {
201 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm, 201 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
202 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm, 202 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
203 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm, 203 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
204 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
204 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir, 205 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
205 .set_vm_context_page_table_base = set_vm_context_page_table_base, 206 .set_vm_context_page_table_base = set_vm_context_page_table_base,
206 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu, 207 .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 1cbdd9a7538e..e7ceae05d517 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1114,6 +1114,25 @@ void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm)
1114 kfree(vm); 1114 kfree(vm);
1115} 1115}
1116 1116
1117void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm)
1118{
1119 struct amdgpu_device *adev = get_amdgpu_device(kgd);
1120 struct amdgpu_vm *avm = (struct amdgpu_vm *)vm;
1121
1122 if (WARN_ON(!kgd || !vm))
1123 return;
1124
1125 pr_debug("Releasing process vm %p\n", vm);
1126
1127 /* The original pasid of amdgpu vm has already been
1128 * released during making a amdgpu vm to a compute vm
1129 * The current pasid is managed by kfd and will be
1130 * released on kfd process destroy. Set amdgpu pasid
1131 * to 0 to avoid duplicate release.
1132 */
1133 amdgpu_vm_release_compute(adev, avm);
1134}
1135
1117uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) 1136uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm)
1118{ 1137{
1119 struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; 1138 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 272b7902a25c..23c78af850c6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2824,6 +2824,26 @@ unreserve_bo:
2824} 2824}
2825 2825
2826/** 2826/**
2827 * amdgpu_vm_release_compute - release a compute vm
2828 * @adev: amdgpu_device pointer
2829 * @vm: a vm turned into compute vm by calling amdgpu_vm_make_compute
2830 *
2831 * This is a correspondant of amdgpu_vm_make_compute. It decouples compute
2832 * pasid from vm. Compute should stop use of vm after this call.
2833 */
2834void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2835{
2836 if (vm->pasid) {
2837 unsigned long flags;
2838
2839 spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
2840 idr_remove(&adev->vm_manager.pasid_idr, vm->pasid);
2841 spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
2842 }
2843 vm->pasid = 0;
2844}
2845
2846/**
2827 * amdgpu_vm_free_levels - free PD/PT levels 2847 * amdgpu_vm_free_levels - free PD/PT levels
2828 * 2848 *
2829 * @adev: amdgpu device structure 2849 * @adev: amdgpu device structure
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index 24b02c91ce0c..62116fa44718 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -298,6 +298,7 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
298int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, 298int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
299 int vm_context, unsigned int pasid); 299 int vm_context, unsigned int pasid);
300int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid); 300int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid);
301void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
301void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); 302void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
302bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev, 303bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev,
303 unsigned int pasid); 304 unsigned int pasid);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index a246b8d76c86..0039e451d9af 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)
322 pr_debug("Releasing pdd (topology id %d) for process (pasid %d)\n", 322 pr_debug("Releasing pdd (topology id %d) for process (pasid %d)\n",
323 pdd->dev->id, p->pasid); 323 pdd->dev->id, p->pasid);
324 324
325 if (pdd->drm_file) 325 if (pdd->drm_file) {
326 pdd->dev->kfd2kgd->release_process_vm(pdd->dev->kgd, pdd->vm);
326 fput(pdd->drm_file); 327 fput(pdd->drm_file);
328 }
327 else if (pdd->vm) 329 else if (pdd->vm)
328 pdd->dev->kfd2kgd->destroy_process_vm( 330 pdd->dev->kfd2kgd->destroy_process_vm(
329 pdd->dev->kgd, pdd->vm); 331 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 4b9981351bb3..814576f6ca1c 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -378,6 +378,7 @@ struct kfd2kgd_calls {
378 unsigned int pasid, void **vm, void **process_info, 378 unsigned int pasid, void **vm, void **process_info,
379 struct dma_fence **ef); 379 struct dma_fence **ef);
380 void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm); 380 void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
381 void (*release_process_vm)(struct kgd_dev *kgd, void *vm);
381 uint32_t (*get_process_page_dir)(void *vm); 382 uint32_t (*get_process_page_dir)(void *vm);
382 void (*set_vm_context_page_table_base)(struct kgd_dev *kgd, 383 void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
383 uint32_t vmid, uint32_t page_table_base); 384 uint32_t vmid, uint32_t page_table_base);