mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 06:09:23 -04:00
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: Sharat Masetty <smasetty@codeaurora.org> Signed-off-by: Mohammed Mirza Mandayappurath Manzoor <mmandaya@codeaurora.org> Signed-off-by: Neeraja P <neerp@codeaurora.org>
This commit is contained in:
parent
32eb6f2bc1
commit
e28d403c5b
5 changed files with 62 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -189,6 +189,23 @@ err:
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue