diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 |
2 files changed, 11 insertions, 5 deletions
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 { | |||
| 881 | struct fence *first; | 881 | struct fence *first; |
| 882 | struct amdgpu_sync active; | 882 | struct amdgpu_sync active; |
| 883 | struct fence *last_flush; | 883 | struct fence *last_flush; |
| 884 | struct amdgpu_ring *last_user; | ||
| 884 | atomic_long_t owner; | 885 | atomic_long_t owner; |
| 885 | 886 | ||
| 886 | uint64_t pd_gpu_addr; | 887 | 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, | |||
| 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 | ||
