Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: add atomic traces

This was useful for debugging fps drops. I suspect it will be useful
again.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Sean Paul <sean@poorly.run>

+136 -4
+1
drivers/gpu/drm/msm/Makefile
··· 75 75 disp/dpu1/dpu_rm.o \ 76 76 disp/dpu1/dpu_vbif.o \ 77 77 msm_atomic.o \ 78 + msm_atomic_tracepoints.o \ 78 79 msm_debugfs.o \ 79 80 msm_drv.o \ 80 81 msm_fb.o \
+21 -3
drivers/gpu/drm/msm/msm_atomic.c
··· 8 8 #include <drm/drm_gem_framebuffer_helper.h> 9 9 #include <drm/drm_vblank.h> 10 10 11 + #include "msm_atomic_trace.h" 11 12 #include "msm_drv.h" 12 13 #include "msm_gem.h" 13 14 #include "msm_kms.h" ··· 31 30 { 32 31 unsigned crtc_mask = BIT(crtc_idx); 33 32 33 + trace_msm_atomic_async_commit_start(crtc_mask); 34 + 34 35 mutex_lock(&kms->commit_lock); 35 36 36 37 if (!(kms->pending_crtc_mask & crtc_mask)) { 37 38 mutex_unlock(&kms->commit_lock); 38 - return; 39 + goto out; 39 40 } 40 41 41 42 kms->pending_crtc_mask &= ~crtc_mask; ··· 47 44 /* 48 45 * Flush hardware updates: 49 46 */ 50 - DRM_DEBUG_ATOMIC("triggering async commit\n"); 47 + trace_msm_atomic_flush_commit(crtc_mask); 51 48 kms->funcs->flush_commit(kms, crtc_mask); 52 49 mutex_unlock(&kms->commit_lock); 53 50 54 51 /* 55 52 * Wait for flush to complete: 56 53 */ 54 + trace_msm_atomic_wait_flush_start(crtc_mask); 57 55 kms->funcs->wait_flush(kms, crtc_mask); 56 + trace_msm_atomic_wait_flush_finish(crtc_mask); 58 57 59 58 mutex_lock(&kms->commit_lock); 60 59 kms->funcs->complete_commit(kms, crtc_mask); 61 60 mutex_unlock(&kms->commit_lock); 62 61 kms->funcs->disable_commit(kms); 62 + 63 + out: 64 + trace_msm_atomic_async_commit_finish(crtc_mask); 63 65 } 64 66 65 67 static enum hrtimer_restart msm_atomic_pending_timer(struct hrtimer *t) ··· 149 141 bool async = kms->funcs->vsync_time && 150 142 can_do_async(state, &async_crtc); 151 143 144 + trace_msm_atomic_commit_tail_start(async, crtc_mask); 145 + 152 146 kms->funcs->enable_commit(kms); 153 147 154 148 /* 155 149 * Ensure any previous (potentially async) commit has 156 150 * completed: 157 151 */ 152 + trace_msm_atomic_wait_flush_start(crtc_mask); 158 153 kms->funcs->wait_flush(kms, crtc_mask); 154 + trace_msm_atomic_wait_flush_finish(crtc_mask); 159 155 160 156 mutex_lock(&kms->commit_lock); 161 157 ··· 210 198 drm_atomic_helper_commit_hw_done(state); 211 199 drm_atomic_helper_cleanup_planes(dev, state); 212 200 201 + trace_msm_atomic_commit_tail_finish(async, crtc_mask); 202 + 213 203 return; 214 204 } 215 205 ··· 224 210 /* 225 211 * Flush hardware updates: 226 212 */ 227 - DRM_DEBUG_ATOMIC("triggering commit\n"); 213 + trace_msm_atomic_flush_commit(crtc_mask); 228 214 kms->funcs->flush_commit(kms, crtc_mask); 229 215 mutex_unlock(&kms->commit_lock); 230 216 231 217 /* 232 218 * Wait for flush to complete: 233 219 */ 220 + trace_msm_atomic_wait_flush_start(crtc_mask); 234 221 kms->funcs->wait_flush(kms, crtc_mask); 222 + trace_msm_atomic_wait_flush_finish(crtc_mask); 235 223 236 224 mutex_lock(&kms->commit_lock); 237 225 kms->funcs->complete_commit(kms, crtc_mask); ··· 242 226 243 227 drm_atomic_helper_commit_hw_done(state); 244 228 drm_atomic_helper_cleanup_planes(dev, state); 229 + 230 + trace_msm_atomic_commit_tail_finish(async, crtc_mask); 245 231 }
+110
drivers/gpu/drm/msm/msm_atomic_trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #if !defined(_MSM_GPU_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) 3 + #define _MSM_GPU_TRACE_H_ 4 + 5 + #include <linux/tracepoint.h> 6 + 7 + #undef TRACE_SYSTEM 8 + #define TRACE_SYSTEM drm_msm_atomic 9 + #define TRACE_INCLUDE_FILE msm_atomic_trace 10 + 11 + TRACE_EVENT(msm_atomic_commit_tail_start, 12 + TP_PROTO(bool async, unsigned crtc_mask), 13 + TP_ARGS(async, crtc_mask), 14 + TP_STRUCT__entry( 15 + __field(bool, async) 16 + __field(u32, crtc_mask) 17 + ), 18 + TP_fast_assign( 19 + __entry->async = async; 20 + __entry->crtc_mask = crtc_mask; 21 + ), 22 + TP_printk("async=%d crtc_mask=%x", 23 + __entry->async, __entry->crtc_mask) 24 + ); 25 + 26 + TRACE_EVENT(msm_atomic_commit_tail_finish, 27 + TP_PROTO(bool async, unsigned crtc_mask), 28 + TP_ARGS(async, crtc_mask), 29 + TP_STRUCT__entry( 30 + __field(bool, async) 31 + __field(u32, crtc_mask) 32 + ), 33 + TP_fast_assign( 34 + __entry->async = async; 35 + __entry->crtc_mask = crtc_mask; 36 + ), 37 + TP_printk("async=%d crtc_mask=%x", 38 + __entry->async, __entry->crtc_mask) 39 + ); 40 + 41 + TRACE_EVENT(msm_atomic_async_commit_start, 42 + TP_PROTO(unsigned crtc_mask), 43 + TP_ARGS(crtc_mask), 44 + TP_STRUCT__entry( 45 + __field(u32, crtc_mask) 46 + ), 47 + TP_fast_assign( 48 + __entry->crtc_mask = crtc_mask; 49 + ), 50 + TP_printk("crtc_mask=%x", 51 + __entry->crtc_mask) 52 + ); 53 + 54 + TRACE_EVENT(msm_atomic_async_commit_finish, 55 + TP_PROTO(unsigned crtc_mask), 56 + TP_ARGS(crtc_mask), 57 + TP_STRUCT__entry( 58 + __field(u32, crtc_mask) 59 + ), 60 + TP_fast_assign( 61 + __entry->crtc_mask = crtc_mask; 62 + ), 63 + TP_printk("crtc_mask=%x", 64 + __entry->crtc_mask) 65 + ); 66 + 67 + TRACE_EVENT(msm_atomic_wait_flush_start, 68 + TP_PROTO(unsigned crtc_mask), 69 + TP_ARGS(crtc_mask), 70 + TP_STRUCT__entry( 71 + __field(u32, crtc_mask) 72 + ), 73 + TP_fast_assign( 74 + __entry->crtc_mask = crtc_mask; 75 + ), 76 + TP_printk("crtc_mask=%x", 77 + __entry->crtc_mask) 78 + ); 79 + 80 + TRACE_EVENT(msm_atomic_wait_flush_finish, 81 + TP_PROTO(unsigned crtc_mask), 82 + TP_ARGS(crtc_mask), 83 + TP_STRUCT__entry( 84 + __field(u32, crtc_mask) 85 + ), 86 + TP_fast_assign( 87 + __entry->crtc_mask = crtc_mask; 88 + ), 89 + TP_printk("crtc_mask=%x", 90 + __entry->crtc_mask) 91 + ); 92 + 93 + TRACE_EVENT(msm_atomic_flush_commit, 94 + TP_PROTO(unsigned crtc_mask), 95 + TP_ARGS(crtc_mask), 96 + TP_STRUCT__entry( 97 + __field(u32, crtc_mask) 98 + ), 99 + TP_fast_assign( 100 + __entry->crtc_mask = crtc_mask; 101 + ), 102 + TP_printk("crtc_mask=%x", 103 + __entry->crtc_mask) 104 + ); 105 + 106 + #endif 107 + 108 + #undef TRACE_INCLUDE_PATH 109 + #define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/msm 110 + #include <trace/define_trace.h>
+3
drivers/gpu/drm/msm/msm_atomic_tracepoints.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + #define CREATE_TRACE_POINTS 3 + #include "msm_atomic_trace.h"
+1 -1
drivers/gpu/drm/msm/msm_gpu_trace.h
··· 5 5 #include <linux/tracepoint.h> 6 6 7 7 #undef TRACE_SYSTEM 8 - #define TRACE_SYSTEM drm_msm 8 + #define TRACE_SYSTEM drm_msm_gpu 9 9 #define TRACE_INCLUDE_FILE msm_gpu_trace 10 10 11 11 TRACE_EVENT(msm_gpu_submit,