diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 2f8496d48c94..8e642fc48df4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -195,6 +195,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
195 | struct amdgpu_job *job) | 195 | struct amdgpu_job *job) |
196 | { | 196 | { |
197 | struct amdgpu_device *adev = ring->adev; | 197 | struct amdgpu_device *adev = ring->adev; |
198 | uint64_t fence_context = adev->fence_context + ring->idx; | ||
198 | struct fence *updates = sync->last_vm_update; | 199 | struct fence *updates = sync->last_vm_update; |
199 | struct amdgpu_vm_id *id, *idle; | 200 | struct amdgpu_vm_id *id, *idle; |
200 | struct fence **fences; | 201 | struct fence **fences; |
@@ -254,7 +255,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
254 | i = ring->idx; | 255 | i = ring->idx; |
255 | do { | 256 | do { |
256 | struct fence *flushed; | 257 | struct fence *flushed; |
257 | bool same_ring = ring->idx == i; | ||
258 | 258 | ||
259 | id = vm->ids[i++]; | 259 | id = vm->ids[i++]; |
260 | if (i == AMDGPU_MAX_RINGS) | 260 | if (i == AMDGPU_MAX_RINGS) |
@@ -272,8 +272,11 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
272 | if (job->vm_pd_addr != id->pd_gpu_addr) | 272 | if (job->vm_pd_addr != id->pd_gpu_addr) |
273 | continue; | 273 | continue; |
274 | 274 | ||
275 | if (!same_ring && | 275 | if (!id->last_flush) |
276 | (!id->last_flush || !fence_is_signaled(id->last_flush))) | 276 | continue; |
277 | |||
278 | if (id->last_flush->context != fence_context && | ||
279 | !fence_is_signaled(id->last_flush)) | ||
277 | continue; | 280 | continue; |
278 | 281 | ||
279 | flushed = id->flushed_updates; | 282 | flushed = id->flushed_updates; |
@@ -294,7 +297,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
294 | 297 | ||
295 | job->vm_id = id - adev->vm_manager.ids; | 298 | job->vm_id = id - adev->vm_manager.ids; |
296 | job->vm_needs_flush = false; | 299 | job->vm_needs_flush = false; |
297 | trace_amdgpu_vm_grab_id(vm, ring->idx, job->vm_id, job->vm_pd_addr); | 300 | trace_amdgpu_vm_grab_id(vm, ring->idx, job); |
298 | 301 | ||
299 | mutex_unlock(&adev->vm_manager.lock); | 302 | mutex_unlock(&adev->vm_manager.lock); |
300 | return 0; | 303 | return 0; |
@@ -325,7 +328,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
325 | vm->ids[ring->idx] = id; | 328 | vm->ids[ring->idx] = id; |
326 | 329 | ||
327 | job->vm_id = id - adev->vm_manager.ids; | 330 | job->vm_id = id - adev->vm_manager.ids; |
328 | trace_amdgpu_vm_grab_id(vm, ring->idx, job->vm_id, job->vm_pd_addr); | 331 | trace_amdgpu_vm_grab_id(vm, ring->idx, job); |
329 | 332 | ||
330 | error: | 333 | error: |
331 | mutex_unlock(&adev->vm_manager.lock); | 334 | mutex_unlock(&adev->vm_manager.lock); |