drm/amdgpu: add limitation for dedicated vm number v4
authorChunming Zhou <David1.Zhou@amd.com>
Fri, 21 Apr 2017 07:51:04 +0000 (15:51 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 May 2017 21:40:09 +0000 (17:40 -0400)
Limit reserved vmids to 1 to avoid taking too many
out of commission and starving the system.

v2: move #define to amdgpu_vm.h
v3: move reserved vmid counter to id_manager,
and increase counter before allocating vmid
v4: rename to reserved_vmid_num

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>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index 86ef0cdfd04dfc0eb99a228e19595827ed7f9768..2ea91392290cf3d63a4e316ba54b9e5c9acbe55f 100644 (file)
@@ -551,6 +551,7 @@ static void amdgpu_vm_free_reserved_vmid(struct amdgpu_device *adev,
                list_add(&vm->reserved_vmid[vmhub]->list,
                        &id_mgr->ids_lru);
                vm->reserved_vmid[vmhub] = NULL;
+               atomic_dec(&id_mgr->reserved_vmid_num);
        }
        mutex_unlock(&id_mgr->lock);
 }
@@ -567,6 +568,13 @@ static int amdgpu_vm_alloc_reserved_vmid(struct amdgpu_device *adev,
        mutex_lock(&id_mgr->lock);
        if (vm->reserved_vmid[vmhub])
                goto unlock;
+       if (atomic_inc_return(&id_mgr->reserved_vmid_num) >
+           AMDGPU_VM_MAX_RESERVED_VMID) {
+               DRM_ERROR("Over limitation of reserved vmid\n");
+               atomic_dec(&id_mgr->reserved_vmid_num);
+               r = -EINVAL;
+               goto unlock;
+       }
        /* Select the first entry VMID */
        idle = list_first_entry(&id_mgr->ids_lru, struct amdgpu_vm_id, list);
        list_del_init(&idle->list);
@@ -2321,6 +2329,7 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
 
                mutex_init(&id_mgr->lock);
                INIT_LIST_HEAD(&id_mgr->ids_lru);
+               atomic_set(&id_mgr->reserved_vmid_num, 0);
 
                /* skip over VMID 0, since it is the system VM */
                for (j = 1; j < id_mgr->num_ids; ++j) {
index 24ccf677f5a5efef4c83b6de0e9ecf206a83c28a..fb25bb747730268ebb3651566eef176772951bb4 100644 (file)
@@ -84,6 +84,8 @@ struct amdgpu_bo_list_entry;
 
 /* hardcode that limit for now */
 #define AMDGPU_VA_RESERVED_SIZE                        (8 << 20)
+/* max vmids dedicated for process */
+#define AMDGPU_VM_MAX_RESERVED_VMID    1
 
 struct amdgpu_vm_pt {
        struct amdgpu_bo        *bo;
@@ -154,6 +156,7 @@ struct amdgpu_vm_id_manager {
        unsigned                num_ids;
        struct list_head        ids_lru;
        struct amdgpu_vm_id     ids[AMDGPU_NUM_VM];
+       atomic_t                reserved_vmid_num;
 };
 
 struct amdgpu_vm_manager {