From 5b71da6a1defefc7584d6eff60987ae5331b4102 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 8 Aug 2015 14:03:48 +0100 Subject: named preserve --- intel/intel_bufmgr_gem.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index 979ae2a4..2fd3c83e 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -1057,6 +1057,8 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr, bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); if (bo_gem->global_name == handle) { drm_intel_gem_bo_reference(&bo_gem->bo); + DRMLISTDEL(&bo_gem->name_list); + DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); pthread_mutex_unlock(&bufmgr_gem->lock); return &bo_gem->bo; } @@ -1083,6 +1085,8 @@ drm_intel_bo_gem_create_from_name(drm_intel_bufmgr *bufmgr, bo_gem = DRMLISTENTRY(drm_intel_bo_gem, list, name_list); if (bo_gem->gem_handle == open_arg.handle) { drm_intel_gem_bo_reference(&bo_gem->bo); + DRMLISTDEL(&bo_gem->name_list); + DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); pthread_mutex_unlock(&bufmgr_gem->lock); return &bo_gem->bo; } @@ -1148,6 +1152,8 @@ drm_intel_gem_bo_free(drm_intel_bo *bo) bufmgr_gem->vma_count--; } + DRMLISTDEL(&bo_gem->name_list); + /* Close this object */ memclear(close); close.handle = bo_gem->gem_handle; @@ -1180,6 +1186,7 @@ drm_intel_gem_bo_mark_mmaps_incoherent(drm_intel_bo *bo) static void drm_intel_gem_cleanup_bo_cache(drm_intel_bufmgr_gem *bufmgr_gem, time_t time) { + drmMMListHead keep; int i; if (bufmgr_gem->time == time) @@ -1188,9 +1195,8 @@ drm_intel_gem_cleanup_bo_cache(drm_intel_bufmgr_gem *bufmgr_gem, time_t time) for (i = 0; i < bufmgr_gem->num_buckets; i++) { struct drm_intel_gem_bo_bucket *bucket = &bufmgr_gem->cache_bucket[i]; - drmMMListHead madv; - DRMINITLISTHEAD(&madv); + DRMINITLISTHEAD(&keep); while (!DRMLISTEMPTY(&bucket->head)) { drm_intel_bo_gem *bo_gem; @@ -1207,11 +1213,32 @@ drm_intel_gem_cleanup_bo_cache(drm_intel_bufmgr_gem *bufmgr_gem, time_t time) drm_intel_gem_bo_free(&bo_gem->bo); } else { drm_intel_gem_bo_madvise_internal(bufmgr_gem, bo_gem, - I915_MADV_DONTNEED); - DRMLISTADDTAIL(&bo_gem->head, &madv); + I915_MADV_DONTNEED); + DRMLISTADDTAIL(&bo_gem->head, &keep); } } - DRMLISTJOIN(&madv, &bucket->head); + DRMLISTJOIN(&keep, &bucket->head); + } + + if (!DRMLISTEMPTY(&bufmgr_gem->named)) { + DRMINITLISTHEAD(&keep); + do { + drm_intel_bo_gem *bo_gem; + + bo_gem = DRMLISTENTRY(drm_intel_bo_gem, + bufmgr_gem->named.next, name_list); + if (atomic_read(&bo_gem->refcount) > 0) + break; + + if (time - bo_gem->free_time < 2) { + DRMLISTDEL(&bo_gem->name_list); + DRMLISTADDTAIL(&bo_gem->name_list, &keep); + continue; + } + + drm_intel_gem_bo_free(&bo_gem->bo); + } while (!DRMLISTEMPTY(&bufmgr_gem->named)); + DRMLISTJOIN(&keep, &bufmgr_gem->named); } bufmgr_gem->time = time; @@ -1327,13 +1354,11 @@ drm_intel_gem_bo_unreference_final(drm_intel_bo *bo, time_t time) drm_intel_gem_bo_mark_mmaps_incoherent(bo); } - DRMLISTDEL(&bo_gem->name_list); + bo_gem->free_time = time; bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, bo->size); /* Put the buffer into our internal cache for reuse if we can. */ if (bufmgr_gem->bo_reuse && bo_gem->reusable && bucket != NULL) { - bo_gem->free_time = time; - bo_gem->name = NULL; bo_gem->validate_index = -1; @@ -1341,6 +1366,9 @@ drm_intel_gem_bo_unreference_final(drm_intel_bo *bo, time_t time) DRMLISTADDTAIL(&bo_gem->head, &bucket->head); else DRMLISTADD(&bo_gem->head, &bucket->head); + } else if (!DRMLISTEMPTY(&bo_gem->name_list)) { + DRMLISTDEL(&bo_gem->name_list); + DRMLISTADD(&bo_gem->name_list, &bufmgr_gem->named); } else { drm_intel_gem_bo_free(bo); } -- cgit v1.2.3