summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-08-08 14:03:48 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-08-08 14:03:48 +0100
commit5b71da6a1defefc7584d6eff60987ae5331b4102 (patch)
treecc65ebadca28039e7a670f9f4d2f42eded6a4add
parent5f6f3e16d64488a5ce8e0f333dd8213e29642bf6 (diff)
named preserveickle
-rw-r--r--intel/intel_bufmgr_gem.c44
1 files 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);
}