xref: /linux/include/trace/events/lock.h (revision 056e065a6b6e01ab54bb9770c0d5a15350e571e2)
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