drm/amdgpu: only update last_flush when vmid doesn't have other new owner
authorChunming Zhou <David1.Zhou@amd.com>
Thu, 14 Apr 2016 05:42:32 +0000 (13:42 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 May 2016 00:22:55 +0000 (20:22 -0400)
Signed-off-by: Chunming Zhou <David1.Zhou@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.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

index 4a2b9a37271d40465e314cbb4b37f4a4477e351d..e4e781658cf141d323f02341f485e3c6437d348e 100644 (file)
@@ -881,6 +881,7 @@ struct amdgpu_vm_id {
        struct fence            *first;
        struct amdgpu_sync      active;
        struct fence            *last_flush;
+       struct amdgpu_ring      *last_user;
        atomic_long_t           owner;
 
        uint64_t                pd_gpu_addr;
index 1425aab312332d85a45007fd6e118f28df319b5a..2aff938f94c67364de9b22c782dcaf8494288d37 100644 (file)
@@ -260,6 +260,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
        id->pd_gpu_addr = pd_addr;
 
        list_move_tail(&id->list, &adev->vm_manager.ids_lru);
+       id->last_user = ring;
        atomic_long_set(&id->owner, (long)vm);
        vm->ids[ring->idx] = id;
 
@@ -307,13 +308,17 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring,
 
                trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id);
                amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr);
-               r = amdgpu_fence_emit(ring, &fence);
-               if (r)
-                       return r;
 
                mutex_lock(&adev->vm_manager.lock);
-               fence_put(id->last_flush);
-               id->last_flush = fence;
+               if ((id->pd_gpu_addr == pd_addr) && (id->last_user == ring)) {
+                       r = amdgpu_fence_emit(ring, &fence);
+                       if (r) {
+                               mutex_unlock(&adev->vm_manager.lock);
+                               return r;
+                       }
+                       fence_put(id->last_flush);
+                       id->last_flush = fence;
+               }
                mutex_unlock(&adev->vm_manager.lock);
        }