diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2017-04-20 04:18:48 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:40:09 -0400 |
commit | 1e9ef26fb385394c3b0267c8293f4178729d8719 (patch) | |
tree | ea0c82273488207828bc4fd72227a8d22d9fcb97 | |
parent | 36bbf3bf9b23a9fe66558e2aa235f7d81c4a0727 (diff) |
drm/amdgpu: reserve/unreserve vmid by vm ioctl v4
add reserve/unreserve vmid funtions. Used to reserve
vmids for certain shader debugging functionality that
required a fixed vmid for the life of the debug.
v3:
only reserve vmid from gfxhub
v4:
fix racy condition
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 64 |
1 files changed, 51 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 6eaeed08237c..86ef0cdfd04d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -540,6 +540,45 @@ error: | |||
540 | return r; | 540 | return r; |
541 | } | 541 | } |
542 | 542 | ||
543 | static void amdgpu_vm_free_reserved_vmid(struct amdgpu_device *adev, | ||
544 | struct amdgpu_vm *vm, | ||
545 | unsigned vmhub) | ||
546 | { | ||
547 | struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub]; | ||
548 | |||
549 | mutex_lock(&id_mgr->lock); | ||
550 | if (vm->reserved_vmid[vmhub]) { | ||
551 | list_add(&vm->reserved_vmid[vmhub]->list, | ||
552 | &id_mgr->ids_lru); | ||
553 | vm->reserved_vmid[vmhub] = NULL; | ||
554 | } | ||
555 | mutex_unlock(&id_mgr->lock); | ||
556 | } | ||
557 | |||
558 | static int amdgpu_vm_alloc_reserved_vmid(struct amdgpu_device *adev, | ||
559 | struct amdgpu_vm *vm, | ||
560 | unsigned vmhub) | ||
561 | { | ||
562 | struct amdgpu_vm_id_manager *id_mgr; | ||
563 | struct amdgpu_vm_id *idle; | ||
564 | int r = 0; | ||
565 | |||
566 | id_mgr = &adev->vm_manager.id_mgr[vmhub]; | ||
567 | mutex_lock(&id_mgr->lock); | ||
568 | if (vm->reserved_vmid[vmhub]) | ||
569 | goto unlock; | ||
570 | /* Select the first entry VMID */ | ||
571 | idle = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vm_id, list); | ||
572 | list_del_init(&idle->list); | ||
573 | vm->reserved_vmid[vmhub] = idle; | ||
574 | mutex_unlock(&id_mgr->lock); | ||
575 | |||
576 | return 0; | ||
577 | unlock: | ||
578 | mutex_unlock(&id_mgr->lock); | ||
579 | return r; | ||
580 | } | ||
581 | |||
543 | static bool amdgpu_vm_ring_has_compute_vm_bug(struct amdgpu_ring *ring) | 582 | static bool amdgpu_vm_ring_has_compute_vm_bug(struct amdgpu_ring *ring) |
544 | { | 583 | { |
545 | struct amdgpu_device *adev = ring->adev; | 584 | struct amdgpu_device *adev = ring->adev; |
@@ -2261,18 +2300,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
2261 | 2300 | ||
2262 | amdgpu_vm_free_levels(&vm->root); | 2301 | amdgpu_vm_free_levels(&vm->root); |
2263 | dma_fence_put(vm->last_dir_update); | 2302 | dma_fence_put(vm->last_dir_update); |
2264 | for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) { | 2303 | for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) |
2265 | struct amdgpu_vm_id_manager *id_mgr = | 2304 | amdgpu_vm_free_reserved_vmid(adev, vm, i); |
2266 | &adev->vm_manager.id_mgr[i]; | ||
2267 | |||
2268 | mutex_lock(&id_mgr->lock); | ||
2269 | if (vm->reserved_vmid[i]) { | ||
2270 | list_add(&vm->reserved_vmid[i]->list, | ||
2271 | &id_mgr->ids_lru); | ||
2272 | vm->reserved_vmid[i] = NULL; | ||
2273 | } | ||
2274 | mutex_unlock(&id_mgr->lock); | ||
2275 | } | ||
2276 | } | 2305 | } |
2277 | 2306 | ||
2278 | /** | 2307 | /** |
@@ -2341,11 +2370,20 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev) | |||
2341 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | 2370 | int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) |
2342 | { | 2371 | { |
2343 | union drm_amdgpu_vm *args = data; | 2372 | union drm_amdgpu_vm *args = data; |
2373 | struct amdgpu_device *adev = dev->dev_private; | ||
2374 | struct amdgpu_fpriv *fpriv = filp->driver_priv; | ||
2375 | int r; | ||
2344 | 2376 | ||
2345 | switch (args->in.op) { | 2377 | switch (args->in.op) { |
2346 | case AMDGPU_VM_OP_RESERVE_VMID: | 2378 | case AMDGPU_VM_OP_RESERVE_VMID: |
2379 | /* current, we only have requirement to reserve vmid from gfxhub */ | ||
2380 | r = amdgpu_vm_alloc_reserved_vmid(adev, &fpriv->vm, | ||
2381 | AMDGPU_GFXHUB); | ||
2382 | if (r) | ||
2383 | return r; | ||
2384 | break; | ||
2347 | case AMDGPU_VM_OP_UNRESERVE_VMID: | 2385 | case AMDGPU_VM_OP_UNRESERVE_VMID: |
2348 | return -EINVAL; | 2386 | amdgpu_vm_free_reserved_vmid(adev, &fpriv->vm, AMDGPU_GFXHUB); |
2349 | break; | 2387 | break; |
2350 | default: | 2388 | default: |
2351 | return -EINVAL; | 2389 | return -EINVAL; |