diff options
author | Oak Zeng <Oak.Zeng@amd.com> | 2018-08-27 15:18:36 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-08-29 13:35:00 -0400 |
commit | bf47afbabf1cf149f9ebc8e1f7dab6913e360dc4 (patch) | |
tree | c199e1bcd080fa3878d025b5c419b8ecb172dd05 /drivers/gpu/drm/amd | |
parent | 1685b01a858872075bc258a350153de0c7e95404 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 1 |
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, | |||
172 | void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, | 172 | void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, |
173 | struct amdgpu_vm *vm); | 173 | struct amdgpu_vm *vm); |
174 | void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); | 174 | void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); |
175 | void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm); | ||
175 | uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); | 176 | uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); |
176 | int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( | 177 | int 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 | ||
1117 | void 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 | |||
1117 | uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) | 1136 | uint32_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 | */ | ||
2834 | void 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); | |||
298 | int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, | 298 | int 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); |
300 | int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid); | 300 | int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid); |
301 | void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm); | ||
301 | void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); | 302 | void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); |
302 | bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev, | 303 | bool 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); |