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

Commit 39c7f041 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Add per process GPU memory usage trace"

parents cfee6a8d e28d403c
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;
}