#include "etnaviv_priv.h"
#include "etnaviv_drmif.h"
-void bo_del(struct etna_bo *bo);
-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)
{
}
}
-/* Frees older cached buffers. Called under table_lock */
+/* 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;
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);
}
}
{
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) {
bo = NULL;
out_unlock:
- pthread_mutex_unlock(&table_lock);
+ pthread_mutex_unlock(&etna_drm_table_lock);
return bo;
}
*size = bucket->size;
bo = find_in_bucket(bucket, flags);
if (bo) {
+ VG_BO_OBTAIN(bo);
p_atomic_set(&bo->refcnt, 1);
etna_device_ref(bo->dev);
return 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);