Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e28d403c authored by Neeraja P's avatar Neeraja P
Browse files

msm: kgsl: Add per process GPU memory usage trace



This patch adds support to trace per process utilization of the GPU
mapped memory. Additionally track the overall gpu memory usage which
includes process allocations, imported dma bufs and kgsl globals.

Change-Id: Icfee373efc7e84efe90cf20486ae6583eaa4f697
Signed-off-by: default avatarSharat Masetty <smasetty@codeaurora.org>
Signed-off-by: default avatarMohammed Mirza Mandayappurath Manzoor <mmandaya@codeaurora.org>
Signed-off-by: default avatarNeeraja P <neerp@codeaurora.org>
parent 32eb6f2b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ config QCOM_KGSL
	depends on ARCH_QCOM
	depends on QCOM_QFPROM
	select MSM_SUBSYSTEM_RESTART
	select TRACE_GPU_MEM
	help
	  3D graphics driver for the Adreno family of GPUs from QTI.
	  Required to use hardware accelerated OpenGL, compute and Vulkan
+6 −0
Original line number Diff line number Diff line
@@ -262,6 +262,7 @@ static void add_dmabuf_list(struct kgsl_dma_buf_meta *meta)
{
	struct dmabuf_list_entry *dle;
	struct page *page;
	struct kgsl_device *device = dev_get_drvdata(meta->attach->dev);

	/*
	 * Get the first page. We will use it to identify the imported
@@ -291,6 +292,8 @@ static void add_dmabuf_list(struct kgsl_dma_buf_meta *meta)
		list_add(&dle->node, &kgsl_dmabuf_list);
		meta->dle = dle;
		list_add(&meta->node, &dle->dmabuf_list);
		kgsl_trace_gpu_mem_total(device,
				 meta->entry->memdesc.size);
	}
	spin_unlock(&kgsl_dmabuf_lock);
}
@@ -298,6 +301,7 @@ static void add_dmabuf_list(struct kgsl_dma_buf_meta *meta)
static void remove_dmabuf_list(struct kgsl_dma_buf_meta *meta)
{
	struct dmabuf_list_entry *dle = meta->dle;
	struct kgsl_device *device = dev_get_drvdata(meta->attach->dev);

	if (!dle)
		return;
@@ -307,6 +311,8 @@ static void remove_dmabuf_list(struct kgsl_dma_buf_meta *meta)
	if (list_empty(&dle->dmabuf_list)) {
		list_del(&dle->node);
		kfree(dle);
		kgsl_trace_gpu_mem_total(device,
				-(meta->entry->memdesc.size));
	}
	spin_unlock(&kgsl_dmabuf_lock);
}
+23 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@

#include <linux/sched/mm.h>
#include <linux/sched/task.h>
#include <trace/events/gpu_mem.h>

#include "kgsl.h"
#include "kgsl_drawobj.h"
@@ -251,6 +252,8 @@ struct kgsl_device {
	uint32_t requested_state;

	atomic_t active_cnt;
	/** @total_mapped: To trace overall gpu memory usage */
	atomic64_t total_mapped;

	wait_queue_head_t active_cnt_wq;
	struct platform_device *pdev;
@@ -997,4 +1000,24 @@ struct kgsl_pwr_limit {
	struct kgsl_device *device;
};

/**
 * kgsl_trace_gpu_mem_total - Overall gpu memory usage tracking which includes
 * process allocations, imported dmabufs and kgsl globals
 * @device: A KGSL device handle
 * @delta: delta of total mapped memory size
 */
#ifdef CONFIG_TRACE_GPU_MEM
static inline void kgsl_trace_gpu_mem_total(struct kgsl_device *device,
						s64 delta)
{
	u64 total_size;

	total_size = atomic64_add_return(delta, &device->total_mapped);
	trace_gpu_mem_total(0, 0, total_size);
}
#else
static inline void kgsl_trace_gpu_mem_total(struct kgsl_device *device,
						s64 delta) {}
#endif

#endif  /* __KGSL_DEVICE_H */
+30 −1
Original line number Diff line number Diff line
@@ -189,6 +189,23 @@ pagetable_add_sysfs_objects(struct kgsl_pagetable *pagetable)
	return ret;
}

#ifdef CONFIG_TRACE_GPU_MEM
static void kgsl_mmu_trace_gpu_mem_pagetable(struct kgsl_pagetable *pagetable)
{
	if (pagetable->name == KGSL_MMU_GLOBAL_PT ||
		pagetable->name == KGSL_MMU_GLOBAL_LPAC_PT ||
		pagetable->name == KGSL_MMU_SECURE_PT)
		return;

	trace_gpu_mem_total(0, pagetable->name,
			(u64)atomic_long_read(&pagetable->stats.mapped));
}
#else
static void kgsl_mmu_trace_gpu_mem_pagetable(struct kgsl_pagetable *pagetable)
{
}
#endif

void
kgsl_mmu_detach_pagetable(struct kgsl_pagetable *pagetable)
{
@@ -358,6 +375,7 @@ kgsl_mmu_map(struct kgsl_pagetable *pagetable,
				struct kgsl_memdesc *memdesc)
{
	int size;
	struct kgsl_device *device = KGSL_MMU_DEVICE(pagetable->mmu);

	if (!memdesc->gpuaddr)
		return -EINVAL;
@@ -378,6 +396,12 @@ kgsl_mmu_map(struct kgsl_pagetable *pagetable,
		atomic_inc(&pagetable->stats.entries);
		KGSL_STATS_ADD(size, &pagetable->stats.mapped,
				&pagetable->stats.max_mapped);
		kgsl_mmu_trace_gpu_mem_pagetable(pagetable);

		if (!kgsl_memdesc_is_global(memdesc)
				&& !(memdesc->flags & KGSL_MEMFLAGS_USERMEM_ION)) {
			kgsl_trace_gpu_mem_total(device, size);
		}

		memdesc->priv |= KGSL_MEMDESC_MAPPED;
	}
@@ -444,6 +468,7 @@ kgsl_mmu_unmap(struct kgsl_pagetable *pagetable,
		struct kgsl_memdesc *memdesc)
{
	int ret = 0;
	struct kgsl_device *device = KGSL_MMU_DEVICE(pagetable->mmu);

	if (memdesc->size == 0)
		return -EINVAL;
@@ -461,9 +486,13 @@ kgsl_mmu_unmap(struct kgsl_pagetable *pagetable,

		atomic_dec(&pagetable->stats.entries);
		atomic_long_sub(size, &pagetable->stats.mapped);
		kgsl_mmu_trace_gpu_mem_pagetable(pagetable);

		if (!kgsl_memdesc_is_global(memdesc))
		if (!kgsl_memdesc_is_global(memdesc)) {
			memdesc->priv &= ~KGSL_MEMDESC_MAPPED;
			if (!(memdesc->flags & KGSL_MEMFLAGS_USERMEM_ION))
				kgsl_trace_gpu_mem_total(device, -(size));
		}
	}

	return ret;
+2 −0
Original line number Diff line number Diff line
@@ -1293,6 +1293,7 @@ kgsl_allocate_secure_global(struct kgsl_device *device,
	 * normally
	 */
	kgsl_mmu_map_global(device, &md->memdesc, 0);
	kgsl_trace_gpu_mem_total(device, md->memdesc.size);

	return &md->memdesc;
}
@@ -1332,6 +1333,7 @@ struct kgsl_memdesc *kgsl_allocate_global(struct kgsl_device *device,
	list_add_tail(&md->node, &device->globals);

	kgsl_mmu_map_global(device, &md->memdesc, padding);
	kgsl_trace_gpu_mem_total(device, md->memdesc.size);

	return &md->memdesc;
}