On Wed, Apr 5, 2017 at 12:22 PM, Christian König <deathsimple at vodafone.de> wrote: > From: Christian König <christian.koenig at amd.com> > > Enable concurrent VM flushes for Vega10. > > Signed-off-by: Christian König <christian.koenig at amd.com> Acked-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 51 +++++++++++++++++++--------------- > 1 file changed, 28 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index 6fd1952..1bb2f8a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -462,11 +462,12 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > } > kfree(fences); > > - job->vm_needs_flush = true; > + job->vm_needs_flush = false; > /* Check if we can use a VMID already assigned to this VM */ > i = ring->idx; > do { > struct fence *flushed; > + bool needs_flush = false; > > id = vm->ids[i++]; > if (i == AMDGPU_MAX_RINGS) > @@ -484,16 +485,17 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > if (job->vm_pd_addr != id->pd_gpu_addr[vmhub]) > continue; > > - if (!id->last_flush[vmhub]) > - continue; > - > - if (id->last_flush[vmhub]->context != fence_context && > - !fence_is_signaled(id->last_flush[vmhub])) > - continue; > + if (!id->last_flush[vmhub] || > + (id->last_flush[vmhub]->context != fence_context && > + !fence_is_signaled(id->last_flush[vmhub]))) > + needs_flush = true; > > flushed = id->flushed_updates[vmhub]; > - if (updates && > - (!flushed || fence_is_later(updates, flushed))) > + if (updates && (!flushed || fence_is_later(updates, flushed))) > + needs_flush = true; > + > + /* Concurrent flushes are only possible starting with Vega10 */ > + if (adev->asic_type < CHIP_VEGA10 && needs_flush) > continue; > > /* Good we can use this VMID. Remember this submission as > @@ -503,15 +505,15 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > if (r) > goto error; > > - list_move_tail(&id->list, &adev->vm_manager.ids_lru); > - vm->ids[ring->idx] = id; > - > - job->vm_id = id - adev->vm_manager.ids; > - job->vm_needs_flush = false; > - trace_amdgpu_vm_grab_id(vm, ring->idx, job); > + if (updates && (!flushed || fence_is_later(updates, flushed))) { > + fence_put(id->flushed_updates[vmhub]); > + id->flushed_updates[vmhub] = fence_get(updates); > + } > > - mutex_unlock(&adev->vm_manager.lock); > - return 0; > + if (needs_flush) > + goto needs_flush; > + else > + goto no_flush_needed; > > } while (i != ring->idx); > > @@ -523,18 +525,21 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > if (r) > goto error; > > + id->pd_gpu_addr[vmhub] = job->vm_pd_addr; > + fence_put(id->flushed_updates[vmhub]); > + id->flushed_updates[vmhub] = fence_get(updates); > + id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); > + atomic64_set(&id->owner, vm->client_id); > + > +needs_flush: > + job->vm_needs_flush = true; > for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { > fence_put(id->last_flush[i]); > id->last_flush[i] = NULL; > } > > - fence_put(id->flushed_updates[vmhub]); > - id->flushed_updates[vmhub] = fence_get(updates); > - > - id->pd_gpu_addr[vmhub] = job->vm_pd_addr; > - id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); > +no_flush_needed: > list_move_tail(&id->list, &adev->vm_manager.ids_lru); > - atomic64_set(&id->owner, vm->client_id); > vm->ids[ring->idx] = id; > > job->vm_id = id - adev->vm_manager.ids; > -- > 2.5.0 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx