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