Commit 434e5ca5 authored by Adrián Larumbe's avatar Adrián Larumbe Committed by Boris Brezillon
Browse files

drm/panthor: Expose size of driver internal BO's over fdinfo



This will display the sizes of kenrel BO's bound to an open file, which are
otherwise not exposed to UM through a handle.

The sizes recorded are as follows:
 - Per group: suspend buffer, protm-suspend buffer, syncobjcs
 - Per queue: ringbuffer, profiling slots, firmware interface
 - For all heaps in all heap pools across all VM's bound to an open file,
 record size of all heap chuks, and for each pool the gpu_context BO too.

This does not record the size of FW regions, as these aren't bound to a
specific open file and remain active through the whole life of the driver.

Reviewed-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
Reviewed-by: default avatarMihail Atanassov <mihail.atanassov@arm.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Reviewed-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: default avatarAdrián Larumbe <adrian.larumbe@collabora.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250130172851.941597-4-adrian.larumbe@collabora.com
parent af6c2b7c
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1457,12 +1457,26 @@ static void panthor_gpu_show_fdinfo(struct panthor_device *ptdev,
	drm_printf(p, "drm-curfreq-panthor:\t%lu Hz\n", ptdev->current_frequency);
}

static void panthor_show_internal_memory_stats(struct drm_printer *p, struct drm_file *file)
{
	char *drv_name = file->minor->dev->driver->name;
	struct panthor_file *pfile = file->driver_priv;
	struct drm_memory_stats stats = {0};

	panthor_fdinfo_gather_group_mem_info(pfile, &stats);
	panthor_vm_heaps_sizes(pfile, &stats);

	drm_fdinfo_print_size(p, drv_name, "resident", "memory", stats.resident);
	drm_fdinfo_print_size(p, drv_name, "active", "memory", stats.active);
}

static void panthor_show_fdinfo(struct drm_printer *p, struct drm_file *file)
{
	struct drm_device *dev = file->minor->dev;
	struct panthor_device *ptdev = container_of(dev, struct panthor_device, base);

	panthor_gpu_show_fdinfo(ptdev, file->driver_priv, p);
	panthor_show_internal_memory_stats(p, file);

	drm_show_memory_stats(p, file);
}
+26 −0
Original line number Diff line number Diff line
@@ -603,3 +603,29 @@ void panthor_heap_pool_destroy(struct panthor_heap_pool *pool)

	panthor_heap_pool_put(pool);
}

/**
 * panthor_heap_pool_size() - Calculate size of all chunks across all heaps in a pool
 * @pool: Pool whose total chunk size to calculate.
 *
 * This function adds the size of all heap chunks across all heaps in the
 * argument pool. It also adds the size of the gpu contexts kernel bo.
 * It is meant to be used by fdinfo for displaying the size of internal
 * driver BO's that aren't exposed to userspace through a GEM handle.
 *
 */
size_t panthor_heap_pool_size(struct panthor_heap_pool *pool)
{
	struct panthor_heap *heap;
	unsigned long i;
	size_t size = 0;

	down_read(&pool->lock);
	xa_for_each(&pool->xa, i, heap)
		size += heap->chunk_size * heap->chunk_count;
	up_read(&pool->lock);

	size += pool->gpu_contexts->obj->size;

	return size;
}
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ struct panthor_heap_pool *
panthor_heap_pool_get(struct panthor_heap_pool *pool);
void panthor_heap_pool_put(struct panthor_heap_pool *pool);

size_t panthor_heap_pool_size(struct panthor_heap_pool *pool);

int panthor_heap_grow(struct panthor_heap_pool *pool,
		      u64 heap_gpu_va,
		      u32 renderpasses_in_flight,
+33 −0
Original line number Diff line number Diff line
@@ -1944,6 +1944,39 @@ struct panthor_heap_pool *panthor_vm_get_heap_pool(struct panthor_vm *vm, bool c
	return pool;
}

/**
 * panthor_vm_heaps_sizes() - Calculate size of all heap chunks across all
 * heaps over all the heap pools in a VM
 * @pfile: File.
 * @stats: Memory stats to be updated.
 *
 * Calculate all heap chunk sizes in all heap pools bound to a VM. If the VM
 * is active, record the size as active as well.
 */
void panthor_vm_heaps_sizes(struct panthor_file *pfile, struct drm_memory_stats *stats)
{
	struct panthor_vm *vm;
	unsigned long i;

	if (!pfile->vms)
		return;

	xa_lock(&pfile->vms->xa);
	xa_for_each(&pfile->vms->xa, i, vm) {
		size_t size = 0;

		mutex_lock(&vm->heaps.lock);
		if (vm->heaps.pool)
			size = panthor_heap_pool_size(vm->heaps.pool);
		mutex_unlock(&vm->heaps.lock);

		stats->resident += size;
		if (vm->as.id >= 0)
			stats->active += size;
	}
	xa_unlock(&pfile->vms->xa);
}

static u64 mair_to_memattr(u64 mair, bool coherent)
{
	u64 memattr = 0;
+3 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

struct drm_exec;
struct drm_sched_job;
struct drm_memory_stats;
struct panthor_gem_object;
struct panthor_heap_pool;
struct panthor_vm;
@@ -37,6 +38,8 @@ int panthor_vm_flush_all(struct panthor_vm *vm);
struct panthor_heap_pool *
panthor_vm_get_heap_pool(struct panthor_vm *vm, bool create);

void panthor_vm_heaps_sizes(struct panthor_file *pfile, struct drm_memory_stats *stats);

struct panthor_vm *panthor_vm_get(struct panthor_vm *vm);
void panthor_vm_put(struct panthor_vm *vm);
struct panthor_vm *panthor_vm_create(struct panthor_device *ptdev, bool for_mcu,
Loading