[Mesa-dev] [PATCH 16/18] anv/allocator: Support pushing multiple blocks onto a free list at once

Jason Ekstrand jason at jlekstrand.net
Wed May 3 18:16:37 UTC 2017


On Wed, May 3, 2017 at 10:19 AM, Juan A. Suarez Romero <jasuarez at igalia.com>
wrote:

> On Wed, 2017-04-26 at 07:35 -0700, Jason Ekstrand wrote:
> > ---
> >  src/intel/vulkan/anv_allocator.c | 19 ++++++++++++++++---
> >  1 file changed, 16 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_
> allocator.c
> > index 0e33d1e..7a687b7 100644
> > --- a/src/intel/vulkan/anv_allocator.c
> > +++ b/src/intel/vulkan/anv_allocator.c
> > @@ -177,11 +177,22 @@ anv_free_list_pop(union anv_free_list *list, void
> **map, int32_t *offset)
> >  }
> >
> >  static void
> > -anv_free_list_push(union anv_free_list *list, void *map, int32_t offset)
> > +anv_free_list_push(union anv_free_list *list, void *map, int32_t offset,
> > +                   uint32_t stride, uint32_t count)
>
> Is stride a good name? Wouldn't it be better to use block_size, or just
> size?
>
> Specially because later we invoke it with block_size/alloc_size.
>

Sure.  I'm happy to rename it.


>
> In any case, Reviewed-by: Juan A. Suarez Romero <jasuarez at igalia.com>
>

Thanks!


>
> >  {
> >     union anv_free_list current, old, new;
> >     int32_t *next_ptr = map + offset;
> >
> > +   /* If we're returning more than one chunk, we need to build a chain
> to add
> > +    * to the list.  Fortunately, we can do this without any atomics
> since we
> > +    * own everything in the chain right now.  `offset` is left pointing
> to the
> > +    * head of our chain list while `next_ptr` points to the tail.
> > +    */
> > +   for (uint32_t i = 1; i < count; i++) {
> > +      VG_NOACCESS_WRITE(next_ptr, offset + i * stride);
> > +      next_ptr = map + offset + i * stride;
> > +   }
> > +
> >     old = *list;
> >     do {
> >        current = old;
> > @@ -742,10 +753,12 @@ anv_state_pool_free_no_vg(struct anv_state_pool
> *pool, struct anv_state state)
> >     if (state.offset < 0) {
> >        assert(state.alloc_size == pool->block_size);
> >        anv_free_list_push(&pool->back_alloc_free_list,
> > -                         pool->block_pool.map, state.offset);
> > +                         pool->block_pool.map, state.offset,
> > +                         state.alloc_size, 1);
> >     } else {
> >        anv_free_list_push(&pool->buckets[bucket].free_list,
> > -                         pool->block_pool.map, state.offset);
> > +                         pool->block_pool.map, state.offset,
> > +                         state.alloc_size, 1);
> >     }
> >  }
> >
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170503/3f9d9fa0/attachment.html>


More information about the mesa-dev mailing list