From: Chunming Zhou Date: Thu, 14 Apr 2016 05:42:32 +0000 (+0800) Subject: drm/amdgpu: only update last_flush when vmid doesn't have other new owner X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=68befebee4927036b0f350825a20d46104f375b5;p=linux-beck.git drm/amdgpu: only update last_flush when vmid doesn't have other new owner Signed-off-by: Chunming Zhou Reviewed-by: Christian König Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 4a2b9a37271d..e4e781658cf1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -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; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 1425aab31233..2aff938f94c6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -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); }