xref: /openbmc/linux/include/trace/events/lock.h (revision dc1f7893)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
267178767SFrederic Weisbecker #undef TRACE_SYSTEM
367178767SFrederic Weisbecker #define TRACE_SYSTEM lock
467178767SFrederic Weisbecker 
567178767SFrederic Weisbecker #if !defined(_TRACE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ)
667178767SFrederic Weisbecker #define _TRACE_LOCK_H
767178767SFrederic Weisbecker 
816edd9b5SNamhyung Kim #include <linux/sched.h>
967178767SFrederic Weisbecker #include <linux/tracepoint.h>
1067178767SFrederic Weisbecker 
1116edd9b5SNamhyung Kim /* flags for lock:contention_begin */
1216edd9b5SNamhyung Kim #define LCB_F_SPIN	(1U << 0)
1316edd9b5SNamhyung Kim #define LCB_F_READ	(1U << 1)
1416edd9b5SNamhyung Kim #define LCB_F_WRITE	(1U << 2)
1516edd9b5SNamhyung Kim #define LCB_F_RT	(1U << 3)
1616edd9b5SNamhyung Kim #define LCB_F_PERCPU	(1U << 4)
17*dc1f7893SPeter Zijlstra #define LCB_F_MUTEX	(1U << 5)
1816edd9b5SNamhyung Kim 
1916edd9b5SNamhyung Kim 
2067178767SFrederic Weisbecker #ifdef CONFIG_LOCKDEP
2167178767SFrederic Weisbecker 
2216edd9b5SNamhyung Kim #include <linux/lockdep.h>
2316edd9b5SNamhyung Kim 
2467178767SFrederic Weisbecker TRACE_EVENT(lock_acquire,
2567178767SFrederic Weisbecker 
2667178767SFrederic Weisbecker 	TP_PROTO(struct lockdep_map *lock, unsigned int subclass,
2767178767SFrederic Weisbecker 		int trylock, int read, int check,
2867178767SFrederic Weisbecker 		struct lockdep_map *next_lock, unsigned long ip),
2967178767SFrederic Weisbecker 
3067178767SFrederic Weisbecker 	TP_ARGS(lock, subclass, trylock, read, check, next_lock, ip),
3167178767SFrederic Weisbecker 
3267178767SFrederic Weisbecker 	TP_STRUCT__entry(
3367178767SFrederic Weisbecker 		__field(unsigned int, flags)
3467178767SFrederic Weisbecker 		__string(name, lock->name)
35c965be10SHitoshi Mitake 		__field(void *, lockdep_addr)
3667178767SFrederic Weisbecker 	),
3767178767SFrederic Weisbecker 
3867178767SFrederic Weisbecker 	TP_fast_assign(
3967178767SFrederic Weisbecker 		__entry->flags = (trylock ? 1 : 0) | (read ? 2 : 0);
4067178767SFrederic Weisbecker 		__assign_str(name, lock->name);
41c965be10SHitoshi Mitake 		__entry->lockdep_addr = lock;
4267178767SFrederic Weisbecker 	),
4367178767SFrederic Weisbecker 
44c965be10SHitoshi Mitake 	TP_printk("%p %s%s%s", __entry->lockdep_addr,
45c965be10SHitoshi Mitake 		  (__entry->flags & 1) ? "try " : "",
4667178767SFrederic Weisbecker 		  (__entry->flags & 2) ? "read " : "",
4767178767SFrederic Weisbecker 		  __get_str(name))
4867178767SFrederic Weisbecker );
4967178767SFrederic Weisbecker 
502c193c73SFrederic Weisbecker DECLARE_EVENT_CLASS(lock,
5167178767SFrederic Weisbecker 
5293135439SFrederic Weisbecker 	TP_PROTO(struct lockdep_map *lock, unsigned long ip),
5367178767SFrederic Weisbecker 
5493135439SFrederic Weisbecker 	TP_ARGS(lock, ip),
5567178767SFrederic Weisbecker 
5667178767SFrederic Weisbecker 	TP_STRUCT__entry(
5767178767SFrederic Weisbecker 		__string(	name, 	lock->name	)
58c965be10SHitoshi Mitake 		__field(	void *, lockdep_addr	)
5967178767SFrederic Weisbecker 	),
6067178767SFrederic Weisbecker 
6167178767SFrederic Weisbecker 	TP_fast_assign(
6267178767SFrederic Weisbecker 		__assign_str(name, lock->name);
63c965be10SHitoshi Mitake 		__entry->lockdep_addr = lock;
6467178767SFrederic Weisbecker 	),
6567178767SFrederic Weisbecker 
662c193c73SFrederic Weisbecker 	TP_printk("%p %s",  __entry->lockdep_addr, __get_str(name))
672c193c73SFrederic Weisbecker );
682c193c73SFrederic Weisbecker 
692c193c73SFrederic Weisbecker DEFINE_EVENT(lock, lock_release,
702c193c73SFrederic Weisbecker 
712c193c73SFrederic Weisbecker 	TP_PROTO(struct lockdep_map *lock, unsigned long ip),
722c193c73SFrederic Weisbecker 
732c193c73SFrederic Weisbecker 	TP_ARGS(lock, ip)
7467178767SFrederic Weisbecker );
7567178767SFrederic Weisbecker 
7667178767SFrederic Weisbecker #ifdef CONFIG_LOCK_STAT
7767178767SFrederic Weisbecker 
782c193c73SFrederic Weisbecker DEFINE_EVENT(lock, lock_contended,
7967178767SFrederic Weisbecker 
8067178767SFrederic Weisbecker 	TP_PROTO(struct lockdep_map *lock, unsigned long ip),
8167178767SFrederic Weisbecker 
822c193c73SFrederic Weisbecker 	TP_ARGS(lock, ip)
8367178767SFrederic Weisbecker );
8467178767SFrederic Weisbecker 
852c193c73SFrederic Weisbecker DEFINE_EVENT(lock, lock_acquired,
862c193c73SFrederic Weisbecker 
87883a2a31SFrederic Weisbecker 	TP_PROTO(struct lockdep_map *lock, unsigned long ip),
8867178767SFrederic Weisbecker 
892c193c73SFrederic Weisbecker 	TP_ARGS(lock, ip)
9067178767SFrederic Weisbecker );
9167178767SFrederic Weisbecker 
9216edd9b5SNamhyung Kim #endif /* CONFIG_LOCK_STAT */
9316edd9b5SNamhyung Kim #endif /* CONFIG_LOCKDEP */
9416edd9b5SNamhyung Kim 
9516edd9b5SNamhyung Kim TRACE_EVENT(contention_begin,
9616edd9b5SNamhyung Kim 
9716edd9b5SNamhyung Kim 	TP_PROTO(void *lock, unsigned int flags),
9816edd9b5SNamhyung Kim 
9916edd9b5SNamhyung Kim 	TP_ARGS(lock, flags),
10016edd9b5SNamhyung Kim 
10116edd9b5SNamhyung Kim 	TP_STRUCT__entry(
10216edd9b5SNamhyung Kim 		__field(void *, lock_addr)
10316edd9b5SNamhyung Kim 		__field(unsigned int, flags)
10416edd9b5SNamhyung Kim 	),
10516edd9b5SNamhyung Kim 
10616edd9b5SNamhyung Kim 	TP_fast_assign(
10716edd9b5SNamhyung Kim 		__entry->lock_addr = lock;
10816edd9b5SNamhyung Kim 		__entry->flags = flags;
10916edd9b5SNamhyung Kim 	),
11016edd9b5SNamhyung Kim 
11116edd9b5SNamhyung Kim 	TP_printk("%p (flags=%s)", __entry->lock_addr,
11216edd9b5SNamhyung Kim 		  __print_flags(__entry->flags, "|",
11316edd9b5SNamhyung Kim 				{ LCB_F_SPIN,		"SPIN" },
11416edd9b5SNamhyung Kim 				{ LCB_F_READ,		"READ" },
11516edd9b5SNamhyung Kim 				{ LCB_F_WRITE,		"WRITE" },
11616edd9b5SNamhyung Kim 				{ LCB_F_RT,		"RT" },
117*dc1f7893SPeter Zijlstra 				{ LCB_F_PERCPU,		"PERCPU" },
118*dc1f7893SPeter Zijlstra 				{ LCB_F_MUTEX,		"MUTEX" }
11916edd9b5SNamhyung Kim 			  ))
12016edd9b5SNamhyung Kim );
12116edd9b5SNamhyung Kim 
12216edd9b5SNamhyung Kim TRACE_EVENT(contention_end,
12316edd9b5SNamhyung Kim 
12416edd9b5SNamhyung Kim 	TP_PROTO(void *lock, int ret),
12516edd9b5SNamhyung Kim 
12616edd9b5SNamhyung Kim 	TP_ARGS(lock, ret),
12716edd9b5SNamhyung Kim 
12816edd9b5SNamhyung Kim 	TP_STRUCT__entry(
12916edd9b5SNamhyung Kim 		__field(void *, lock_addr)
13016edd9b5SNamhyung Kim 		__field(int, ret)
13116edd9b5SNamhyung Kim 	),
13216edd9b5SNamhyung Kim 
13316edd9b5SNamhyung Kim 	TP_fast_assign(
13416edd9b5SNamhyung Kim 		__entry->lock_addr = lock;
13516edd9b5SNamhyung Kim 		__entry->ret = ret;
13616edd9b5SNamhyung Kim 	),
13716edd9b5SNamhyung Kim 
13816edd9b5SNamhyung Kim 	TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret)
13916edd9b5SNamhyung Kim );
14067178767SFrederic Weisbecker 
14167178767SFrederic Weisbecker #endif /* _TRACE_LOCK_H */
14267178767SFrederic Weisbecker 
14367178767SFrederic Weisbecker /* This part must be outside protection */
14467178767SFrederic Weisbecker #include <trace/define_trace.h>
145