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