msm: kgsl: add userspace memory alloc and free tracepoints

Add events for tracking memory operations by userspace
clients: kgsl_mem_alloc, kgsl_mem_map, kgsl_mem_free,
kgsl_mem_timestamp_queue (adding an entry to the free
on timestamp list) and kgsl_mem_timestamp_free (when
the memory is actually freed).

Change-Id: Id62eec30ea20a0f00f7a7a791c7e5b8dfad487af
Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
This commit is contained in:
Jeremy Gebben
2012-03-05 11:39:46 -07:00
parent 9d15ae432b
commit a5859279c8
2 changed files with 128 additions and 1 deletions
+11
View File
@@ -1024,6 +1024,7 @@ static void kgsl_freemem_event_cb(struct kgsl_device *device,
spin_lock(&entry->priv->mem_lock);
list_del(&entry->list);
spin_unlock(&entry->priv->mem_lock);
trace_kgsl_mem_timestamp_free(entry, timestamp);
kgsl_mem_entry_put(entry);
}
@@ -1034,12 +1035,18 @@ static long kgsl_ioctl_cmdstream_freememontimestamp(struct kgsl_device_private
int result = 0;
struct kgsl_cmdstream_freememontimestamp *param = data;
struct kgsl_mem_entry *entry = NULL;
struct kgsl_device *device = dev_priv->device;
unsigned int cur;
spin_lock(&dev_priv->process_priv->mem_lock);
entry = kgsl_sharedmem_find(dev_priv->process_priv, param->gpuaddr);
spin_unlock(&dev_priv->process_priv->mem_lock);
if (entry) {
cur = device->ftbl->readtimestamp(device,
KGSL_TIMESTAMP_RETIRED);
trace_kgsl_mem_timestamp_queue(entry, cur);
result = kgsl_add_event(dev_priv->device, param->timestamp,
kgsl_freemem_event_cb, entry, dev_priv);
} else {
@@ -1118,6 +1125,7 @@ static long kgsl_ioctl_sharedmem_free(struct kgsl_device_private *dev_priv,
spin_unlock(&private->mem_lock);
if (entry) {
trace_kgsl_mem_free(entry);
kgsl_mem_entry_put(entry);
} else {
KGSL_CORE_ERR("invalid gpuaddr %08x\n", param->gpuaddr);
@@ -1218,6 +1226,7 @@ kgsl_ioctl_sharedmem_from_vmalloc(struct kgsl_device_private *dev_priv,
kgsl_mem_entry_attach_process(entry, private);
trace_kgsl_mem_alloc(entry);
/* Process specific statistics */
kgsl_process_add_stats(private, entry->memtype, len);
@@ -1652,6 +1661,7 @@ static long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
kgsl_process_add_stats(private, entry->memtype, param->len);
kgsl_mem_entry_attach_process(entry, private);
trace_kgsl_mem_map(entry, param->fd);
kgsl_check_idle(dev_priv->device);
return result;
@@ -1718,6 +1728,7 @@ kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv,
param->gpuaddr = entry->memdesc.gpuaddr;
kgsl_process_add_stats(private, entry->memtype, param->size);
trace_kgsl_mem_alloc(entry);
} else
kfree(entry);
+117 -1
View File
@@ -1,4 +1,4 @@
/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
/* Copyright (c) 2011-2012, Code Aurora Forum. 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
@@ -257,6 +257,122 @@ DEFINE_EVENT(kgsl_pwrstate_template, kgsl_pwr_request_state,
TP_ARGS(device, state)
);
TRACE_EVENT(kgsl_mem_alloc,
TP_PROTO(struct kgsl_mem_entry *mem_entry),
TP_ARGS(mem_entry),
TP_STRUCT__entry(
__field(unsigned int, gpuaddr)
__field(unsigned int, size)
),
TP_fast_assign(
__entry->gpuaddr = mem_entry->memdesc.gpuaddr;
__entry->size = mem_entry->memdesc.size;
),
TP_printk(
"gpuaddr=0x%08x size=%d",
__entry->gpuaddr, __entry->size
)
);
TRACE_EVENT(kgsl_mem_map,
TP_PROTO(struct kgsl_mem_entry *mem_entry, int fd),
TP_ARGS(mem_entry, fd),
TP_STRUCT__entry(
__field(unsigned int, gpuaddr)
__field(unsigned int, size)
__field(int, fd)
__field(int, type)
),
TP_fast_assign(
__entry->gpuaddr = mem_entry->memdesc.gpuaddr;
__entry->size = mem_entry->memdesc.size;
__entry->fd = fd;
__entry->type = mem_entry->memtype;
),
TP_printk(
"gpuaddr=0x%08x size=%d type=%d fd=%d",
__entry->gpuaddr, __entry->size,
__entry->type, __entry->fd
)
);
TRACE_EVENT(kgsl_mem_free,
TP_PROTO(struct kgsl_mem_entry *mem_entry),
TP_ARGS(mem_entry),
TP_STRUCT__entry(
__field(unsigned int, gpuaddr)
__field(unsigned int, size)
__field(int, type)
__field(int, fd)
),
TP_fast_assign(
__entry->gpuaddr = mem_entry->memdesc.gpuaddr;
__entry->size = mem_entry->memdesc.size;
__entry->type = mem_entry->memtype;
),
TP_printk(
"gpuaddr=0x%08x size=%d type=%d",
__entry->gpuaddr, __entry->size, __entry->type
)
);
DECLARE_EVENT_CLASS(kgsl_mem_timestamp_template,
TP_PROTO(struct kgsl_mem_entry *mem_entry, unsigned int curr_ts),
TP_ARGS(mem_entry, curr_ts),
TP_STRUCT__entry(
__field(unsigned int, gpuaddr)
__field(unsigned int, size)
__field(int, type)
__field(unsigned int, drawctxt_id)
__field(unsigned int, curr_ts)
__field(unsigned int, free_ts)
),
TP_fast_assign(
__entry->gpuaddr = mem_entry->memdesc.gpuaddr;
__entry->size = mem_entry->memdesc.size;
__entry->drawctxt_id = 1337;
__entry->type = mem_entry->memtype;
__entry->curr_ts = curr_ts;
__entry->free_ts = mem_entry->free_timestamp;
),
TP_printk(
"gpuaddr=0x%08x size=%d type=%d ctx=%u curr_ts=0x%08x free_ts=0x%08x",
__entry->gpuaddr, __entry->size, __entry->type,
__entry->drawctxt_id, __entry->curr_ts, __entry->free_ts
)
);
DEFINE_EVENT(kgsl_mem_timestamp_template, kgsl_mem_timestamp_queue,
TP_PROTO(struct kgsl_mem_entry *mem_entry, unsigned int curr_ts),
TP_ARGS(mem_entry, curr_ts)
);
DEFINE_EVENT(kgsl_mem_timestamp_template, kgsl_mem_timestamp_free,
TP_PROTO(struct kgsl_mem_entry *mem_entry, unsigned int curr_ts),
TP_ARGS(mem_entry, curr_ts)
);
#endif /* _KGSL_TRACE_H */
/* This part must be outside protection */