diff options
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 | ||