diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index cbdf90230f7..b7356ac44ff 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -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); diff --git a/drivers/gpu/msm/kgsl_trace.h b/drivers/gpu/msm/kgsl_trace.h index 86a9adc0586..22bc5763d04 100644 --- a/drivers/gpu/msm/kgsl_trace.h +++ b/drivers/gpu/msm/kgsl_trace.h @@ -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 */