[Mesa-dev] [PATCH v2 07/18] anv/allocator: Add a BO cache

Chris Wilson chris at chris-wilson.co.uk
Wed Mar 15 15:37:41 UTC 2017


On Wed, Mar 15, 2017 at 08:28:24AM -0700, Jason Ekstrand wrote:
>    On Wed, Mar 15, 2017 at 5:21 AM, Chris Wilson
>    <[1]chris at chris-wilson.co.uk> wrote:
> 
>      On Wed, Mar 15, 2017 at 09:50:57AM +0000, Chris Wilson wrote:
>      > On Tue, Mar 14, 2017 at 10:43:07PM -0700, Jason Ekstrand wrote:
>      > > +void
>      > > +anv_bo_cache_release(struct anv_device *device,
>      > > +                     struct anv_bo_cache *cache,
>      > > +                     struct anv_bo *bo_in,
>      > > +                     VkAllocationCallbacks *alloc)
>      > > +{
>      > > +   assert(anv_bo_cache_lookup(cache, bo_in->gem_handle) == bo_in);
>      > > +   struct anv_cached_bo *bo = (struct anv_cached_bo *)bo_in;
>      > > +
>      > > +   uint32_t count = __sync_fetch_and_add(&bo->refcount, -1);
>      > > +   assert(count > 0);
>      > > +   if (count > 1)
>      > > +      return;
>      > > +   assert(count == 1);
>      > > +   assert(bo->refcount == 0);
>      >
>      > There's a window here for a second thread to acquire a reference to
>      the
>      > bo, just before you then go and free it.
>      >
>      > The trick is the final unref has to be inside the mutex, earlier can
>      be
>      > outside. See refcount_dec_and_lock() in the kernel.
> 
>      The alternative is to check against the dead bo when retrieving from the
>      cache (under the mutex) -- refcount_add_not_zero. That is probably the
>      cheaper option.
> 
>    How about if I just check the refcount again after I've entered the mutex
>    and release the mutex and bail if it isn't zero?  The only time the
>    reference count is ever imported is in import and it's done inside the
>    mutex.  That's the cheapest option.

The second thread (that acquired the ref from the cache) may also drop
it before you acquire the mutex. You now have two threads that see
bo->refcount as 0 inside anv_bo_cache_release().
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the mesa-dev mailing list