diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2016-04-14 01:42:32 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-05-04 20:22:55 -0400 |
commit | 68befebee4927036b0f350825a20d46104f375b5 (patch) | |
tree | b848b169f36b3207cf20a58200e6ee3fe635180b /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
parent | 66067ad73c384a1780421e48a72a69b393359aa7 (diff) |
drm/amdgpu: only update last_flush when vmid doesn't have other new owner
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>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 |
1 files changed, 10 insertions, 5 deletions
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, | |||
260 | id->pd_gpu_addr = pd_addr; | 260 | id->pd_gpu_addr = pd_addr; |
261 | 261 | ||
262 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); | 262 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); |
263 | id->last_user = ring; | ||
263 | atomic_long_set(&id->owner, (long)vm); | 264 | atomic_long_set(&id->owner, (long)vm); |
264 | vm->ids[ring->idx] = id; | 265 | vm->ids[ring->idx] = id; |
265 | 266 | ||
@@ -307,13 +308,17 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, | |||
307 | 308 | ||
308 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id); | 309 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id); |
309 | amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr); | 310 | amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr); |
310 | r = amdgpu_fence_emit(ring, &fence); | ||
311 | if (r) | ||
312 | return r; | ||
313 | 311 | ||
314 | mutex_lock(&adev->vm_manager.lock); | 312 | mutex_lock(&adev->vm_manager.lock); |
315 | fence_put(id->last_flush); | 313 | if ((id->pd_gpu_addr == pd_addr) && (id->last_user == ring)) { |
316 | id->last_flush = fence; | 314 | r = amdgpu_fence_emit(ring, &fence); |
315 | if (r) { | ||
316 | mutex_unlock(&adev->vm_manager.lock); | ||
317 | return r; | ||
318 | } | ||
319 | fence_put(id->last_flush); | ||
320 | id->last_flush = fence; | ||
321 | } | ||
317 | mutex_unlock(&adev->vm_manager.lock); | 322 | mutex_unlock(&adev->vm_manager.lock); |
318 | } | 323 | } |
319 | 324 | ||