On Mon, Jul 30, 2018 at 04:51:57PM +0200, Christian König wrote: > Add helpers to iterate over all entries in a bo_list. > > Signed-off-by: Christian König <christian.koenig at amd.com> Nice wrapper. Acked-by: Huang Rui <ray.huang at amd.com> Thanks, Ray > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 21 ++++++------ > drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h | 10 ++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 51 +++++++++++++---------------- > 3 files changed, 43 insertions(+), 39 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c > index 5335f1b5459f..096bcf4a6334 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c > @@ -43,12 +43,12 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, > > static void amdgpu_bo_list_release_rcu(struct kref *ref) > { > - unsigned i; > struct amdgpu_bo_list *list = container_of(ref, struct amdgpu_bo_list, > refcount); > + struct amdgpu_bo_list_entry *e; > > - for (i = 0; i < list->num_entries; ++i) > - amdgpu_bo_unref(&list->array[i].robj); > + amdgpu_bo_list_for_each_entry(e, list) > + amdgpu_bo_unref(&e->robj); > > kvfree(list->array); > kfree_rcu(list, rhead); > @@ -103,6 +103,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, > struct amdgpu_bo *oa_obj = adev->gds.oa_gfx_bo; > > unsigned last_entry = 0, first_userptr = num_entries; > + struct amdgpu_bo_list_entry *e; > uint64_t total_size = 0; > unsigned i; > int r; > @@ -156,7 +157,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, > trace_amdgpu_bo_list_set(list, entry->robj); > } > > - for (i = 0; i < list->num_entries; ++i) > + amdgpu_bo_list_for_each_entry(e, list) > amdgpu_bo_unref(&list->array[i].robj); > > kvfree(list->array); > @@ -201,6 +202,7 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list, > * concatenated in descending order. > */ > struct list_head bucket[AMDGPU_BO_LIST_NUM_BUCKETS]; > + struct amdgpu_bo_list_entry *e; > unsigned i; > > for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++) > @@ -211,14 +213,13 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list, > * in the list, the sort mustn't change the ordering of buffers > * with the same priority, i.e. it must be stable. > */ > - for (i = 0; i < list->num_entries; i++) { > - unsigned priority = list->array[i].priority; > + amdgpu_bo_list_for_each_entry(e, list) { > + unsigned priority = e->priority; > > - if (!list->array[i].robj->parent) > - list_add_tail(&list->array[i].tv.head, > - &bucket[priority]); > + if (!e->robj->parent) > + list_add_tail(&e->tv.head, &bucket[priority]); > > - list->array[i].user_pages = NULL; > + e->user_pages = NULL; > } > > /* Connect the sorted buckets in the output list. */ > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h > index 0ce540203db1..3d77abfcd4a6 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h > @@ -65,4 +65,14 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev, > unsigned num_entries, > struct amdgpu_bo_list **list); > > +#define amdgpu_bo_list_for_each_entry(e, list) \ > + for (e = &(list)->array[0]; \ > + e != &(list)->array[(list)->num_entries]; \ > + ++e) > + > +#define amdgpu_bo_list_for_each_userptr_entry(e, list) \ > + for (e = &(list)->array[(list)->first_userptr]; \ > + e != &(list)->array[(list)->num_entries]; \ > + ++e) > + > #endif > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > index f7154f3ed807..1d7292ab2b62 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -563,10 +563,10 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, > struct amdgpu_fpriv *fpriv = p->filp->driver_priv; > struct amdgpu_bo_list_entry *e; > struct list_head duplicates; > - unsigned i, tries = 10; > struct amdgpu_bo *gds; > struct amdgpu_bo *gws; > struct amdgpu_bo *oa; > + unsigned tries = 10; > int r; > > INIT_LIST_HEAD(&p->validated); > @@ -596,7 +596,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, > > while (1) { > struct list_head need_pages; > - unsigned i; > > r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, > &duplicates); > @@ -611,12 +610,8 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, > break; > > INIT_LIST_HEAD(&need_pages); > - for (i = p->bo_list->first_userptr; > - i < p->bo_list->num_entries; ++i) { > - struct amdgpu_bo *bo; > - > - e = &p->bo_list->array[i]; > - bo = e->robj; > + amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { > + struct amdgpu_bo *bo = e->robj; > > if (amdgpu_ttm_tt_userptr_invalidated(bo->tbo.ttm, > &e->user_invalidated) && e->user_pages) { > @@ -710,16 +705,14 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, > > if (p->bo_list) { > struct amdgpu_vm *vm = &fpriv->vm; > - unsigned i; > + struct amdgpu_bo_list_entry *e; > > gds = p->bo_list->gds_obj; > gws = p->bo_list->gws_obj; > oa = p->bo_list->oa_obj; > - for (i = 0; i < p->bo_list->num_entries; i++) { > - struct amdgpu_bo *bo = p->bo_list->array[i].robj; > > - p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo); > - } > + amdgpu_bo_list_for_each_entry(e, p->bo_list) > + e->bo_va = amdgpu_vm_bo_find(vm, e->robj); > } else { > gds = p->adev->gds.gds_gfx_bo; > gws = p->adev->gds.gws_gfx_bo; > @@ -753,10 +746,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, > error_free_pages: > > if (p->bo_list) { > - for (i = p->bo_list->first_userptr; > - i < p->bo_list->num_entries; ++i) { > - e = &p->bo_list->array[i]; > - > + amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { > if (!e->user_pages) > continue; > > @@ -830,7 +820,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p) > struct amdgpu_vm *vm = &fpriv->vm; > struct amdgpu_bo_va *bo_va; > struct amdgpu_bo *bo; > - int i, r; > + int r; > > r = amdgpu_vm_clear_freed(adev, vm, NULL); > if (r) > @@ -861,15 +851,17 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p) > } > > if (p->bo_list) { > - for (i = 0; i < p->bo_list->num_entries; i++) { > + struct amdgpu_bo_list_entry *e; > + > + amdgpu_bo_list_for_each_entry(e, p->bo_list) { > struct dma_fence *f; > > /* ignore duplicates */ > - bo = p->bo_list->array[i].robj; > + bo = e->robj; > if (!bo) > continue; > > - bo_va = p->bo_list->array[i].bo_va; > + bo_va = e->bo_va; > if (bo_va == NULL) > continue; > > @@ -898,14 +890,15 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p) > return r; > > if (amdgpu_vm_debug && p->bo_list) { > + struct amdgpu_bo_list_entry *e; > + > /* Invalidate all BOs to test for userspace bugs */ > - for (i = 0; i < p->bo_list->num_entries; i++) { > + amdgpu_bo_list_for_each_entry(e, p->bo_list) { > /* ignore duplicates */ > - bo = p->bo_list->array[i].robj; > - if (!bo) > + if (!e->robj) > continue; > > - amdgpu_vm_bo_invalidate(adev, bo, false); > + amdgpu_vm_bo_invalidate(adev, e->robj, false); > } > } > > @@ -1225,16 +1218,16 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, > struct drm_sched_entity *entity = &p->ctx->rings[ring->idx].entity; > enum drm_sched_priority priority; > struct amdgpu_job *job; > - unsigned i; > uint64_t seq; > > int r; > > amdgpu_mn_lock(p->mn); > if (p->bo_list) { > - for (i = p->bo_list->first_userptr; > - i < p->bo_list->num_entries; ++i) { > - struct amdgpu_bo *bo = p->bo_list->array[i].robj; > + struct amdgpu_bo_list_entry *e; > + > + amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { > + struct amdgpu_bo *bo = e->robj; > > if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) { > amdgpu_mn_unlock(p->mn); > -- > 2.14.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx