aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2017-04-20 04:18:48 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-05-24 17:40:09 -0400
commit1e9ef26fb385394c3b0267c8293f4178729d8719 (patch)
treeea0c82273488207828bc4fd72227a8d22d9fcb97
parent36bbf3bf9b23a9fe66558e2aa235f7d81c4a0727 (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.c64
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
543static 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
558static 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;
577unlock:
578 mutex_unlock(&id_mgr->lock);
579 return r;
580}
581
543static bool amdgpu_vm_ring_has_compute_vm_bug(struct amdgpu_ring *ring) 582static 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)
2341int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 2370int 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;