v3dv/bo: add dump stats info

Focused specially on the cache, how many BOs and how much bo_size is
store on the cache, freed bos, bos moved to cache etc.

Initially not configured with V3D_DEBUG (like v3d) to avoid a runtime
check on most of v3dv_bo functions.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Alejandro Piñeiro
2020-06-18 10:59:57 +02:00
committed by Marge Bot
parent f78c99f357
commit 682cfd84d9
+91 -1
View File
@@ -37,6 +37,50 @@
*/
#define DEFAULT_MAX_BO_CACHE_SIZE 512
/* Discarded to use a V3D_DEBUG for this, as it would mean adding a run-time
* check for most of the calls
*/
static const bool dump_stats = false;
static void
bo_dump_stats(struct v3dv_device *device)
{
struct v3dv_bo_cache *cache = &device->bo_cache;
fprintf(stderr, " BOs allocated: %d\n", device->bo_count);
fprintf(stderr, " BOs size: %dkb\n", device->bo_size / 1024);
fprintf(stderr, " BOs cached: %d\n", cache->cache_count);
fprintf(stderr, " BOs cached size: %dkb\n", cache->cache_size / 1024);
if (!list_is_empty(&cache->time_list)) {
struct v3dv_bo *first = list_first_entry(&cache->time_list,
struct v3dv_bo,
time_list);
struct v3dv_bo *last = list_last_entry(&cache->time_list,
struct v3dv_bo,
time_list);
fprintf(stderr, " oldest cache time: %ld\n",
(long)first->free_time);
fprintf(stderr, " newest cache time: %ld\n",
(long)last->free_time);
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
fprintf(stderr, " now: %ld\n",
time.tv_sec);
}
if (cache->size_list_size) {
uint32_t empty_size_list = 0;
for (uint32_t i = 0; i < cache->size_list_size; i++) {
if (list_is_empty(&cache->size_list[i]))
empty_size_list++;
}
fprintf(stderr, " Empty size_list lists: %d\n", empty_size_list);
}
}
static void
bo_remove_from_cache(struct v3dv_bo_cache *cache, struct v3dv_bo *bo)
{
@@ -99,6 +143,15 @@ bo_free(struct v3dv_device *device,
device->bo_count--;
device->bo_size -= bo->size;
if (dump_stats) {
fprintf(stderr, "Freed %s%s%dkb:\n",
bo->name ? bo->name : "",
bo->name ? " " : "",
bo->size / 1024);
bo_dump_stats(device);
}
vk_free(&device->alloc, bo);
return ret == 0;
@@ -135,8 +188,14 @@ v3dv_bo_alloc(struct v3dv_device *device,
if (private) {
bo = bo_from_cache(device, size, name);
if (bo)
if (bo) {
if (dump_stats) {
fprintf(stderr, "Allocated %s %dkb from cache:\n",
name, size / 1024);
bo_dump_stats(device);
}
return bo;
}
}
bo = vk_alloc(&device->alloc, sizeof(struct v3dv_bo), 8,
@@ -183,6 +242,10 @@ v3dv_bo_alloc(struct v3dv_device *device,
device->bo_count++;
device->bo_size += bo->size;
if (dump_stats) {
fprintf(stderr, "Allocated %s %dkb:\n", name, size / 1024);
bo_dump_stats(device);
}
return bo;
}
@@ -318,6 +381,10 @@ v3dv_bo_cache_init(struct v3dv_device *device)
else
device->bo_cache.max_cache_size = atoll(max_cache_size_str);
if (dump_stats) {
fprintf(stderr, "MAX BO CACHE SIZE: %iMB\n", device->bo_cache.max_cache_size);
}
device->bo_cache.max_cache_size *= 1024 * 1024;
device->bo_cache.cache_count = 0;
device->bo_cache.cache_size = 0;
@@ -328,6 +395,11 @@ v3dv_bo_cache_destroy(struct v3dv_device *device)
{
bo_cache_free_all(device, true);
vk_free(&device->alloc, device->bo_cache.size_list);
if (dump_stats) {
fprintf(stderr, "BO stats after screen destroy:\n");
bo_dump_stats(device);
}
}
@@ -336,17 +408,29 @@ free_stale_bos(struct v3dv_device *device,
time_t time)
{
struct v3dv_bo_cache *cache = &device->bo_cache;
bool freed_any = false;
list_for_each_entry_safe(struct v3dv_bo, bo, &cache->time_list,
time_list) {
/* If it's more than a second old, free it. */
if (time - bo->free_time > 2) {
if (dump_stats && !freed_any) {
fprintf(stderr, "Freeing stale BOs:\n");
bo_dump_stats(device);
freed_any = true;
}
bo_remove_from_cache(cache, bo);
bo_free(device, bo);
} else {
break;
}
}
if (dump_stats && freed_any) {
fprintf(stderr, "Freed stale BOs:\n");
bo_dump_stats(device);
}
}
bool
@@ -394,6 +478,12 @@ v3dv_bo_free(struct v3dv_device *device,
cache->cache_count++;
cache->cache_size += bo->size;
if (dump_stats) {
fprintf(stderr, "Freed %s %dkb to cache:\n",
bo->name, bo->size / 1024);
bo_dump_stats(device);
}
bo->name = NULL;
free_stale_bos(device, time.tv_sec);