1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM lock 4 5 #if !defined(_TRACE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_LOCK_H 7 8 #include <linux/tracepoint.h> 9 10 /* flags for lock:contention_begin */ 11 #define LCB_F_SPIN (1U << 0) 12 #define LCB_F_READ (1U << 1) 13 #define LCB_F_WRITE (1U << 2) 14 #define LCB_F_RT (1U << 3) 15 #define LCB_F_PERCPU (1U << 4) 16 #define LCB_F_MUTEX (1U << 5) 17 18 19 #ifdef CONFIG_LOCKDEP 20 21 #include <linux/lockdep.h> 22 23 TRACE_EVENT(lock_acquire, 24 25 TP_PROTO(struct lockdep_map *lock, unsigned int subclass, 26 int trylock, int read, int check, 27 struct lockdep_map *next_lock, unsigned long ip), 28 29 TP_ARGS(lock, subclass, trylock, read, check, next_lock, ip), 30 31 TP_STRUCT__entry( 32 __field(unsigned int, flags) 33 __string(name, lock->name) 34 __field(void *, lockdep_addr) 35 ), 36 37 TP_fast_assign( 38 __entry->flags = (trylock ? 1 : 0) | (read ? 2 : 0); 39 __assign_str(name); 40 __entry->lockdep_addr = lock; 41 ), 42 43 TP_printk("%p %s%s%s", __entry->lockdep_addr, 44 (__entry->flags & 1) ? "try " : "", 45 (__entry->flags & 2) ? "read " : "", 46 __get_str(name)) 47 ); 48 49 DECLARE_EVENT_CLASS(lock, 50 51 TP_PROTO(struct lockdep_map *lock, unsigned long ip), 52 53 TP_ARGS(lock, ip), 54 55 TP_STRUCT__entry( 56 __string( name, lock->name ) 57 __field( void *, lockdep_addr ) 58 ), 59 60 TP_fast_assign( 61 __assign_str(name); 62 __entry->lockdep_addr = lock; 63 ), 64 65 TP_printk("%p %s", __entry->lockdep_addr, __get_str(name)) 66 ); 67 68 DEFINE_EVENT(lock, lock_release, 69 70 TP_PROTO(struct lockdep_map *lock, unsigned long ip), 71 72 TP_ARGS(lock, ip) 73 ); 74 75 #ifdef CONFIG_LOCK_STAT 76 77 DEFINE_EVENT(lock, lock_contended, 78 79 TP_PROTO(struct lockdep_map *lock, unsigned long ip), 80 81 TP_ARGS(lock, ip) 82 ); 83 84 DEFINE_EVENT(lock, lock_acquired, 85 86 TP_PROTO(struct lockdep_map *lock, unsigned long ip), 87 88 TP_ARGS(lock, ip) 89 ); 90 91 #endif /* CONFIG_LOCK_STAT */ 92 #endif /* CONFIG_LOCKDEP */ 93 94 TRACE_EVENT(contention_begin, 95 96 TP_PROTO(void *lock, unsigned int flags), 97 98 TP_ARGS(lock, flags), 99 100 TP_STRUCT__entry( 101 __field(void *, lock_addr) 102 __field(unsigned int, flags) 103 ), 104 105 TP_fast_assign( 106 __entry->lock_addr = lock; 107 __entry->flags = flags; 108 ), 109 110 TP_printk("%p (flags=%s)", __entry->lock_addr, 111 __print_flags(__entry->flags, "|", 112 { LCB_F_SPIN, "SPIN" }, 113 { LCB_F_READ, "READ" }, 114 { LCB_F_WRITE, "WRITE" }, 115 { LCB_F_RT, "RT" }, 116 { LCB_F_PERCPU, "PERCPU" }, 117 { LCB_F_MUTEX, "MUTEX" } 118 )) 119 ); 120 121 TRACE_EVENT(contention_end, 122 123 TP_PROTO(void *lock, int ret), 124 125 TP_ARGS(lock, ret), 126 127 TP_STRUCT__entry( 128 __field(void *, lock_addr) 129 __field(int, ret) 130 ), 131 132 TP_fast_assign( 133 __entry->lock_addr = lock; 134 __entry->ret = ret; 135 ), 136 137 TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret) 138 ); 139 140 TRACE_EVENT(contended_release, 141 142 TP_PROTO(void *lock), 143 144 TP_ARGS(lock), 145 146 TP_STRUCT__entry( 147 __field(void *, lock_addr) 148 ), 149 150 TP_fast_assign( 151 __entry->lock_addr = lock; 152 ), 153 154 TP_printk("%p", __entry->lock_addr) 155 ); 156 157 #endif /* _TRACE_LOCK_H */ 158 159 /* This part must be outside protection */ 160 #include <trace/define_trace.h> 161