iris: Avoid holding the lock while allocating pages.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 30 May 2019 07:04:38 +0000 (00:04 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 30 May 2019 07:46:37 +0000 (00:46 -0700)
We only need the lock for:
1. Rummaging through the cache
2. Allocating VMA

We don't need it for alloc_fresh_bo(), which does GEM_CREATE, and also
SET_DOMAIN to allocate the underlying pages.  The idea behind calling
SET_DOMAIN was to avoid a lock in the kernel while allocating pages,
now we avoid our own global lock as well.

We do have to re-lock around VMA.  Hopefully this shouldn't happen too
much in practice because we'll find a cached BO in the right memzone
and not have to reallocate it.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
src/gallium/drivers/iris/iris_bufmgr.c

index 4628d72643c1c59c0824dac6b9e1c553a11df5fe..9894618b1de7258238ddc1de9e69e09e4d4c1521 100644 (file)
@@ -482,14 +482,18 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
    if (!bo)
       bo = alloc_bo_from_cache(bufmgr, bucket, memzone, flags, false);
 
+   mtx_unlock(&bufmgr->lock);
+
    if (!bo) {
       bo = alloc_fresh_bo(bufmgr, bo_size);
       if (!bo)
-         goto err;
+         return NULL;
    }
 
    if (bo->gtt_offset == 0ull) {
+      mtx_lock(&bufmgr->lock);
       bo->gtt_offset = vma_alloc(bufmgr, memzone, bo->size, 1);
+      mtx_unlock(&bufmgr->lock);
 
       if (bo->gtt_offset == 0ull)
          goto err_free;
@@ -498,8 +502,6 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
    if (bo_set_tiling_internal(bo, tiling_mode, stride))
       goto err_free;
 
-   mtx_unlock(&bufmgr->lock);
-
    bo->name = name;
    p_atomic_set(&bo->refcount, 1);
    bo->reusable = bucket && bufmgr->bo_reuse;
@@ -531,8 +533,6 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
 
 err_free:
    bo_free(bo);
-err:
-   mtx_unlock(&bufmgr->lock);
    return NULL;
 }