From e917bb7ad4300a1943a0100114c708915324127c Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Thu, 30 May 2019 00:04:38 -0700 Subject: [PATCH] iris: Avoid holding the lock while allocating pages. 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 --- src/gallium/drivers/iris/iris_bufmgr.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index 4628d72643c..9894618b1de 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -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; } -- 2.30.2