On Tue, Apr 11, 2017 at 4:44 AM, Christian König <deathsimple at vodafone.de> wrote: > From: Christian König <christian.koenig at amd.com> > > David suggested this a long time ago, instead of checking > each ring just walk over all the VMIDs in reverse LRU order. > > Signed-off-by: Christian König <christian.koenig at amd.com> > Reviewed-by: Andres Rodriguez <andresx7 at gmail.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 17 +++-------------- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 3 --- > 2 files changed, 3 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index 157ae50..de6558b 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -463,17 +463,10 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > > job->vm_needs_flush = true; > /* Check if we can use a VMID already assigned to this VM */ > - i = ring->idx; > - do { > + list_for_each_entry_reverse(id, &adev->vm_manager.ids_lru, list) { > struct fence *flushed; > > - id = vm->ids[i++]; > - if (i == AMDGPU_MAX_RINGS) > - i = 0; > - > /* Check all the prerequisites to using this VMID */ > - if (!id) > - continue; > if (amdgpu_vm_had_gpu_reset(adev, id)) > continue; > > @@ -503,7 +496,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > 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; > @@ -512,7 +504,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > mutex_unlock(&adev->vm_manager.lock); > return 0; > > - } while (i != ring->idx); > + }; > > /* Still no ID to use? Then use the idle one found earlier */ > id = idle; > @@ -532,7 +524,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, > id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); > 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; > trace_amdgpu_vm_grab_id(vm, ring->idx, job); > @@ -2117,10 +2108,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) > unsigned ring_instance; > struct amdgpu_ring *ring; > struct amd_sched_rq *rq; > - int i, r; > + int r; > > - for (i = 0; i < AMDGPU_MAX_RINGS; ++i) > - vm->ids[i] = NULL; > vm->va = RB_ROOT; > vm->client_id = atomic64_inc_return(&adev->vm_manager.client_counter); > spin_lock_init(&vm->status_lock); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > index 6f158d6..46987b4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h > @@ -114,9 +114,6 @@ struct amdgpu_vm { > struct fence *last_dir_update; > uint64_t last_eviction_counter; > > - /* for id and flush management per ring */ > - struct amdgpu_vm_id *ids[AMDGPU_MAX_RINGS]; > - > /* protecting freed */ > spinlock_t freed_lock; > > -- > 2.5.0 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx