From: Kenneth Graunke Date: Thu, 30 May 2019 07:04:38 +0000 (-0700) Subject: iris: Avoid holding the lock while allocating pages. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e917bb7ad4300a1943a0100114c708915324127c;p=mesa.git 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 --- 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; }