summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarshdeep Dhatt <hdhatt@codeaurora.org>2016-01-06 14:52:02 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:16:58 -0700
commit55946b698578eb75a2d05611004f521864409355 (patch)
treee353bdcbc78229901c1bdf5e8304e61b60635ddd
parent0117f1ce831945422d463f493b4cf1d81e3a7067 (diff)
msm: kgsl: Add accounting for memory mapped in userspace
For proper memory accounting, a key metric is to know how much memory kgsl allocated for a process and how much of it the process is actually using. This is done by keeping track of memory in our vmfault routines. This information is provided via the process mem file. Change-Id: I7e3371a708ea5fdade3840b2384b3bc4012ad004 Signed-off-by: Harshdeep Dhatt <hdhatt@codeaurora.org>
-rw-r--r--drivers/gpu/msm/kgsl.h4
-rw-r--r--drivers/gpu/msm/kgsl_debugfs.c10
-rw-r--r--drivers/gpu/msm/kgsl_sharedmem.c6
3 files changed, 13 insertions, 7 deletions
diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h
index f675c4446081..dfe83be799b3 100644
--- a/drivers/gpu/msm/kgsl.h
+++ b/drivers/gpu/msm/kgsl.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -147,6 +147,7 @@ struct kgsl_memdesc_ops {
* @gpuaddr: GPU virtual address
* @physaddr: Physical address of the memory object
* @size: Size of the memory object
+ * @mapsize: Size of memory mapped in userspace
* @priv: Internal flags and settings
* @sgt: Scatter gather table for allocated pages
* @ops: Function hooks for the memdesc memory type
@@ -163,6 +164,7 @@ struct kgsl_memdesc {
uint64_t gpuaddr;
phys_addr_t physaddr;
uint64_t size;
+ uint64_t mapsize;
unsigned int priv;
struct sg_table *sgt;
struct kgsl_memdesc_ops *ops;
diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c
index 11095f38bad7..fa523ac9516c 100644
--- a/drivers/gpu/msm/kgsl_debugfs.c
+++ b/drivers/gpu/msm/kgsl_debugfs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2002,2008-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2002,2008-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -144,12 +144,12 @@ static int print_mem_entry(int id, void *ptr, void *data)
kgsl_get_memory_usage(usage, sizeof(usage), m->flags);
- seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d",
+ seq_printf(s, "%pK %pK %16llu %5d %8s %10s %16s %5d %16llu",
(uint64_t *)(uintptr_t) m->gpuaddr,
(unsigned long *) m->useraddr,
m->size, entry->id, flags,
memtype_str(kgsl_memdesc_usermem_type(m)),
- usage, m->sgt->nents);
+ usage, m->sgt->nents, m->mapsize);
if (entry->metadata[0] != 0)
seq_printf(s, " %s", entry->metadata);
@@ -163,9 +163,9 @@ static int process_mem_print(struct seq_file *s, void *unused)
{
struct kgsl_process_private *private = s->private;
- seq_printf(s, "%8s %8s %8s %5s %8s %10s %16s %5s\n",
+ seq_printf(s, "%16s %16s %16s %5s %8s %10s %16s %5s %16s\n",
"gpuaddr", "useraddr", "size", "id", "flags", "type",
- "usage", "sglen");
+ "usage", "sglen", "mapsize");
spin_lock(&private->mem_lock);
idr_for_each(&private->mem_idr, print_mem_entry, s);
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c
index 8bf0a243066e..bc955ae66285 100644
--- a/drivers/gpu/msm/kgsl_sharedmem.c
+++ b/drivers/gpu/msm/kgsl_sharedmem.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2002,2007-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -385,6 +385,8 @@ static int kgsl_page_alloc_vmfault(struct kgsl_memdesc *memdesc,
get_page(page);
vmf->page = page;
+ memdesc->mapsize += PAGE_SIZE;
+
return 0;
}
@@ -550,6 +552,8 @@ static int kgsl_contiguous_vmfault(struct kgsl_memdesc *memdesc,
else if (ret == -EFAULT)
return VM_FAULT_SIGBUS;
+ memdesc->mapsize += PAGE_SIZE;
+
return VM_FAULT_NOPAGE;
}