From 3a9c5960d9516b1d0615e163085bbf25cc88891b Mon Sep 17 00:00:00 2001 From: Rohan Sethi Date: Thu, 26 Aug 2021 14:34:17 +0530 Subject: [PATCH] msm: kgsl: Add timeline traces Add some traces to make it easier to debug and track timeline behavior. Change-Id: Ic0dedbadbfe623c675616a0d2fdd800b49f14705 Signed-off-by: Jordan Crouse Signed-off-by: Rohan Sethi --- drivers/gpu/msm/kgsl.c | 3 + drivers/gpu/msm/kgsl_drawobj.c | 1 + drivers/gpu/msm/kgsl_timeline.c | 12 +++ drivers/gpu/msm/kgsl_trace.h | 179 +++++++++++++++++++++++++++++++- 4 files changed, 194 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index b859d49640eb..2244a9f3dcbd 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2147,6 +2147,9 @@ long kgsl_ioctl_gpu_aux_command(struct kgsl_device_private *dev_priv, return -ENOMEM; } + trace_kgsl_aux_command(context->id, param->numcmds, param->flags, + param->timestamp); + if (param->flags & KGSL_GPU_AUX_COMMAND_SYNC) { struct kgsl_drawobj_sync *syncobj = kgsl_drawobj_sync_create(device, context); diff --git a/drivers/gpu/msm/kgsl_drawobj.c b/drivers/gpu/msm/kgsl_drawobj.c index 969f8b5aefc0..91b3e4e2602f 100644 --- a/drivers/gpu/msm/kgsl_drawobj.c +++ b/drivers/gpu/msm/kgsl_drawobj.c @@ -904,6 +904,7 @@ int kgsl_drawobj_add_timeline(struct kgsl_device_private *dev_priv, goto err; } + trace_kgsl_drawobj_timeline(val.timeline, val.seqno); timelineobj->timelines[i].seqno = val.seqno; src += cmd.timelines_size; diff --git a/drivers/gpu/msm/kgsl_timeline.c b/drivers/gpu/msm/kgsl_timeline.c index 80605ca5e373..3da5298813f5 100644 --- a/drivers/gpu/msm/kgsl_timeline.c +++ b/drivers/gpu/msm/kgsl_timeline.c @@ -12,6 +12,7 @@ #include "kgsl_device.h" #include "kgsl_sharedmem.h" #include "kgsl_timeline.h" +#include "kgsl_trace.h" struct kgsl_timeline_fence { struct dma_fence base; @@ -100,6 +101,8 @@ void kgsl_timeline_destroy(struct kref *kref) WARN_ON(!list_empty(&timeline->fences)); + trace_kgsl_timeline_destroy(timeline->id); + kfree(timeline); } @@ -145,6 +148,8 @@ static struct kgsl_timeline *kgsl_timeline_alloc( snprintf((char *) timeline->name, sizeof(timeline->name), "kgsl-sw-timeline-%d", id); + trace_kgsl_timeline_alloc(id, initial); + spin_lock_init(&timeline->lock); spin_lock_init(&timeline->fence_lock); @@ -177,6 +182,8 @@ static void timeline_fence_release(struct dma_fence *fence) } spin_unlock_irqrestore(&timeline->fence_lock, flags); + trace_kgsl_timeline_fence_release(f->timeline->id, fence->seqno); + kgsl_timeline_put(f->timeline); dma_fence_free(fence); } @@ -258,6 +265,8 @@ void kgsl_timeline_signal(struct kgsl_timeline *timeline, u64 seqno) if (seqno < timeline->value) goto unlock; + trace_kgsl_timeline_signal(timeline->id, seqno); + timeline->value = seqno; spin_lock(&timeline->fence_lock); @@ -307,6 +316,7 @@ struct dma_fence *kgsl_timeline_fence_alloc(struct kgsl_timeline *timeline, if (!dma_fence_is_signaled_locked(&fence->base)) kgsl_timeline_add_fence(timeline, fence); + trace_kgsl_timeline_fence_alloc(timeline->id, seqno); spin_unlock_irq(&timeline->lock); return &fence->base; @@ -378,6 +388,8 @@ long kgsl_ioctl_timeline_wait(struct kgsl_device_private *dev_priv, timeout = msecs_to_jiffies(ktime_to_ms(time)); } + trace_kgsl_timeline_wait(param->flags, param->tv_sec, param->tv_nsec); + /* secs.nsecs to jiffies */ if (!timeout) ret = dma_fence_is_signaled(fence) ? 0 : -EBUSY; diff --git a/drivers/gpu/msm/kgsl_trace.h b/drivers/gpu/msm/kgsl_trace.h index 501d97eb0e3a..60fbe5b03348 100644 --- a/drivers/gpu/msm/kgsl_trace.h +++ b/drivers/gpu/msm/kgsl_trace.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2011-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2021, The Linux Foundation. All rights reserved. */ #if !defined(_KGSL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) @@ -1292,6 +1292,183 @@ TRACE_EVENT(kgsl_opp_notify, __entry->min_freq, __entry->max_freq ) ); + +TRACE_EVENT(kgsl_timeline_alloc, + TP_PROTO( + u32 id, + u64 seqno + ), + TP_ARGS( + id, + seqno + ), + TP_STRUCT__entry( + __field(u32, id) + __field(u64, seqno) + ), + TP_fast_assign( + __entry->id = id; + __entry->seqno = seqno; + ), + TP_printk("id=%u initial=%llu", + __entry->id, __entry->seqno + ) +); + +TRACE_EVENT(kgsl_timeline_destroy, + TP_PROTO( + u32 id + ), + TP_ARGS( + id + ), + TP_STRUCT__entry( + __field(u32, id) + ), + TP_fast_assign( + __entry->id = id; + ), + TP_printk("id=%u", + __entry->id + ) +); + + +TRACE_EVENT(kgsl_timeline_signal, + TP_PROTO( + u32 id, + u64 seqno + ), + TP_ARGS( + id, + seqno + ), + TP_STRUCT__entry( + __field(u32, id) + __field(u64, seqno) + ), + TP_fast_assign( + __entry->id = id; + __entry->seqno = seqno; + ), + TP_printk("id=%u seqno=%llu", + __entry->id, __entry->seqno + ) +); + +TRACE_EVENT(kgsl_timeline_fence_alloc, + TP_PROTO( + u32 timeline, + u64 seqno + ), + TP_ARGS( + timeline, + seqno + ), + TP_STRUCT__entry( + __field(u32, timeline) + __field(u64, seqno) + ), + TP_fast_assign( + __entry->timeline = timeline; + __entry->seqno = seqno; + ), + TP_printk("timeline=%u seqno=%llu", + __entry->timeline, __entry->seqno + ) +); + +TRACE_EVENT(kgsl_timeline_fence_release, + TP_PROTO( + u32 timeline, + u64 seqno + ), + TP_ARGS( + timeline, + seqno + ), + TP_STRUCT__entry( + __field(u32, timeline) + __field(u64, seqno) + ), + TP_fast_assign( + __entry->timeline = timeline; + __entry->seqno = seqno; + ), + TP_printk("timeline=%u seqno=%llu", + __entry->timeline, __entry->seqno + ) +); + + +TRACE_EVENT(kgsl_timeline_wait, + TP_PROTO( + u32 flags, + s64 tv_sec, + s64 tv_nsec + ), + TP_ARGS( + flags, + tv_sec, + tv_nsec + ), + TP_STRUCT__entry( + __field(u32, flags) + __field(s64, tv_sec) + __field(s64, tv_nsec) + ), + TP_fast_assign( + __entry->flags = flags; + __entry->tv_sec = tv_sec; + __entry->tv_nsec = tv_nsec; + ), + TP_printk("flags=0x%x tv_sec=%llu tv_nsec=%llu", + __entry->flags, __entry->tv_sec, __entry->tv_nsec + + ) +); + +TRACE_EVENT(kgsl_aux_command, + TP_PROTO(u32 drawctxt_id, u32 numcmds, u32 flags, u32 timestamp + ), + TP_ARGS(drawctxt_id, numcmds, flags, timestamp + ), + TP_STRUCT__entry( + __field(u32, drawctxt_id) + __field(u32, numcmds) + __field(u32, flags) + __field(u32, timestamp) + ), + TP_fast_assign( + __entry->drawctxt_id = drawctxt_id; + __entry->numcmds = numcmds; + __entry->flags = flags; + __entry->timestamp = timestamp; + ), + TP_printk("context=%u numcmds=%u flags=0x%x timestamp=%u", + __entry->drawctxt_id, __entry->numcmds, __entry->flags, + __entry->timestamp + ) +); + +TRACE_EVENT(kgsl_drawobj_timeline, + TP_PROTO(u32 timeline, u64 seqno + ), + TP_ARGS(timeline, seqno + ), + TP_STRUCT__entry( + __field(u32, timeline) + __field(u64, seqno) + ), + TP_fast_assign( + __entry->timeline = timeline; + __entry->seqno = seqno; + ), + TP_printk("timeline=%u seqno=%llu", + __entry->timeline, __entry->seqno + ) +); + #endif /* _KGSL_TRACE_H */ /* This part must be outside protection */