projects/linux·blob master · refs

166 lines · 3.1 KiB

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
23TRACE_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
49DECLARE_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
68DEFINE_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
77DEFINE_EVENT(lock, lock_contended,
78
79 TP_PROTO(struct lockdep_map *lock, unsigned long ip),
80
81 TP_ARGS(lock, ip)
82);
83
84DEFINE_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
94TRACE_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
121TRACE_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/* kernel/locking/mutex.c */
141int arch_contended_release_trace_reg(void);
142void arch_contended_release_trace_unreg(void);
143
144TRACE_EVENT_FN(contended_release,
145
146 TP_PROTO(void *lock),
147
148 TP_ARGS(lock),
149
150 TP_STRUCT__entry(
151 __field(void *, lock_addr)
152 ),
153
154 TP_fast_assign(
155 __entry->lock_addr = lock;
156 ),
157
158 TP_printk("%p", __entry->lock_addr),
159
160 arch_contended_release_trace_reg, arch_contended_release_trace_unreg
161);
162
163#endif /* _TRACE_LOCK_H */
164
165/* This part must be outside protection */
166#include <trace/define_trace.h>