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

Chris Wilson chris at chris-wilson.co.uk
Wed Mar 15 16:08:12 UTC 2017


On Wed, Mar 15, 2017 at 08:54:40AM -0700, Jason Ekstrand wrote:
>    On Wed, Mar 15, 2017 at 8:37 AM, Chris Wilson
>    <[1]chris at chris-wilson.co.uk> wrote:
> 
>      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][2]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.
> 
>    I don't think that will actually work.  I assume that what you mean is to
>    do refcount_add_not_zero and, if it fails (because the refcount is
>    currently zero), then we treat it as if the cached BO has already been
>    deleted.  The problem is that, if we hit this case, we've already acquired
>    a GEM handle and if we let the release go ahead and delete the cached BO,
>    then our gem handle will get deleted.  I think I need to go with option
>    1.  Thanks for all your review!

Yeah, you would have to pass on the unexpected error. More complicated
dance around unref it is, have fun! :)
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the mesa-dev mailing list