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, lock->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, lock->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 | |