drm/amdgpu: improve vmid assigment V2
authorChunming Zhou <David1.Zhou@amd.com>
Thu, 17 Mar 2016 03:41:37 +0000 (11:41 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 2 May 2016 19:04:11 +0000 (15:04 -0400)
V2: the signaled items on the LRU maintain their order

Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index b6c011b83641205b5a7466d499017a80b8d2275a..6630732ea1bd2e9ebabfad2022e726cd426844b2 100644 (file)
@@ -216,6 +216,20 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
                                      struct amdgpu_vm_manager_id,
                                      list);
 
+       if (id->mgr_id->active && !fence_is_signaled(id->mgr_id->active)) {
+               struct amdgpu_vm_manager_id *mgr_id, *tmp;
+               struct list_head *head = &adev->vm_manager.ids_lru;
+               list_for_each_entry_safe(mgr_id, tmp, &adev->vm_manager.ids_lru, list) {
+                       if (mgr_id->active && fence_is_signaled(mgr_id->active)) {
+                               list_move(&mgr_id->list, head);
+                               head = &mgr_id->list;
+                       }
+               }
+               id->mgr_id = list_first_entry(&adev->vm_manager.ids_lru,
+                                             struct amdgpu_vm_manager_id,
+                                             list);
+       }
+
        r = amdgpu_sync_fence(ring->adev, sync, id->mgr_id->active);
        if (!r) {
                fence_put(id->mgr_id->active);