etnaviv: drm: Don't miscalculate timeout
[mesa.git] / src / etnaviv / drm / etnaviv_bo_cache.c
index c81de262f8ae147b10592b18c136e994276df05d..93893b52b23aefe49ba6ee769133c78eb0284ae1 100644 (file)
@@ -27,8 +27,8 @@
 #include "etnaviv_priv.h"
 #include "etnaviv_drmif.h"
 
-drm_private void bo_del(struct etna_bo *bo);
-drm_private extern pthread_mutex_t table_lock;
+void _etna_bo_del(struct etna_bo *bo);
+extern pthread_mutex_t etna_drm_table_lock;
 
 static void add_bucket(struct etna_bo_cache *cache, int size)
 {
@@ -41,7 +41,7 @@ static void add_bucket(struct etna_bo_cache *cache, int size)
        cache->num_buckets++;
 }
 
-drm_private void etna_bo_cache_init(struct etna_bo_cache *cache)
+void etna_bo_cache_init(struct etna_bo_cache *cache)
 {
        unsigned long size, cache_max_size = 64 * 1024 * 1024;
 
@@ -66,8 +66,8 @@ drm_private void etna_bo_cache_init(struct etna_bo_cache *cache)
        }
 }
 
-/* Frees older cached buffers.  Called under table_lock */
-drm_private void etna_bo_cache_cleanup(struct etna_bo_cache *cache, time_t time)
+/* Frees older cached buffers.  Called under etna_drm_table_lock */
+void etna_bo_cache_cleanup(struct etna_bo_cache *cache, time_t time)
 {
        unsigned i;
 
@@ -78,15 +78,16 @@ drm_private void etna_bo_cache_cleanup(struct etna_bo_cache *cache, time_t time)
                struct etna_bo_bucket *bucket = &cache->cache_bucket[i];
                struct etna_bo *bo;
 
-               while (!LIST_IS_EMPTY(&bucket->list)) {
+               while (!list_is_empty(&bucket->list)) {
                        bo = LIST_ENTRY(struct etna_bo, bucket->list.next, list);
 
                        /* keep things in cache for at least 1 second: */
                        if (time && ((time - bo->free_time) <= 1))
                                break;
 
+                       VG_BO_OBTAIN(bo);
                        list_del(&bo->list);
-                       bo_del(bo);
+                       _etna_bo_del(bo);
                }
        }
 
@@ -122,9 +123,9 @@ static struct etna_bo *find_in_bucket(struct etna_bo_bucket *bucket, uint32_t fl
 {
        struct etna_bo *bo = NULL, *tmp;
 
-       pthread_mutex_lock(&table_lock);
+       pthread_mutex_lock(&etna_drm_table_lock);
 
-       if (LIST_IS_EMPTY(&bucket->list))
+       if (list_is_empty(&bucket->list))
                goto out_unlock;
 
        LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &bucket->list, list) {
@@ -146,7 +147,7 @@ static struct etna_bo *find_in_bucket(struct etna_bo_bucket *bucket, uint32_t fl
        bo = NULL;
 
 out_unlock:
-       pthread_mutex_unlock(&table_lock);
+       pthread_mutex_unlock(&etna_drm_table_lock);
 
        return bo;
 }
@@ -155,7 +156,7 @@ out_unlock:
  *
  * NOTE: size is potentially rounded up to bucket size
  */
-drm_private struct etna_bo *etna_bo_cache_alloc(struct etna_bo_cache *cache, uint32_t *size,
+struct etna_bo *etna_bo_cache_alloc(struct etna_bo_cache *cache, uint32_t *size,
     uint32_t flags)
 {
        struct etna_bo *bo;
@@ -169,7 +170,8 @@ drm_private struct etna_bo *etna_bo_cache_alloc(struct etna_bo_cache *cache, uin
                *size = bucket->size;
                bo = find_in_bucket(bucket, flags);
                if (bo) {
-                       atomic_set(&bo->refcnt, 1);
+                       VG_BO_OBTAIN(bo);
+                       p_atomic_set(&bo->refcnt, 1);
                        etna_device_ref(bo->dev);
                        return bo;
                }
@@ -178,7 +180,7 @@ drm_private struct etna_bo *etna_bo_cache_alloc(struct etna_bo_cache *cache, uin
        return NULL;
 }
 
-drm_private int etna_bo_cache_free(struct etna_bo_cache *cache, struct etna_bo *bo)
+int etna_bo_cache_free(struct etna_bo_cache *cache, struct etna_bo *bo)
 {
        struct etna_bo_bucket *bucket = get_bucket(cache, bo->size);
 
@@ -189,6 +191,7 @@ drm_private int etna_bo_cache_free(struct etna_bo_cache *cache, struct etna_bo *
                clock_gettime(CLOCK_MONOTONIC, &time);
 
                bo->free_time = time.tv_sec;
+               VG_BO_RELEASE(bo);
                list_addtail(&bo->list, &bucket->list);
                etna_bo_cache_cleanup(cache, time.tv_sec);