0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM lock
0004
0005 #if !defined(_TRACE_LOCK_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_LOCK_H
0007
0008 #include <linux/sched.h>
0009 #include <linux/tracepoint.h>
0010
0011
0012 #define LCB_F_SPIN (1U << 0)
0013 #define LCB_F_READ (1U << 1)
0014 #define LCB_F_WRITE (1U << 2)
0015 #define LCB_F_RT (1U << 3)
0016 #define LCB_F_PERCPU (1U << 4)
0017 #define LCB_F_MUTEX (1U << 5)
0018
0019
0020 #ifdef CONFIG_LOCKDEP
0021
0022 #include <linux/lockdep.h>
0023
0024 TRACE_EVENT(lock_acquire,
0025
0026 TP_PROTO(struct lockdep_map *lock, unsigned int subclass,
0027 int trylock, int read, int check,
0028 struct lockdep_map *next_lock, unsigned long ip),
0029
0030 TP_ARGS(lock, subclass, trylock, read, check, next_lock, ip),
0031
0032 TP_STRUCT__entry(
0033 __field(unsigned int, flags)
0034 __string(name, lock->name)
0035 __field(void *, lockdep_addr)
0036 ),
0037
0038 TP_fast_assign(
0039 __entry->flags = (trylock ? 1 : 0) | (read ? 2 : 0);
0040 __assign_str(name, lock->name);
0041 __entry->lockdep_addr = lock;
0042 ),
0043
0044 TP_printk("%p %s%s%s", __entry->lockdep_addr,
0045 (__entry->flags & 1) ? "try " : "",
0046 (__entry->flags & 2) ? "read " : "",
0047 __get_str(name))
0048 );
0049
0050 DECLARE_EVENT_CLASS(lock,
0051
0052 TP_PROTO(struct lockdep_map *lock, unsigned long ip),
0053
0054 TP_ARGS(lock, ip),
0055
0056 TP_STRUCT__entry(
0057 __string( name, lock->name )
0058 __field( void *, lockdep_addr )
0059 ),
0060
0061 TP_fast_assign(
0062 __assign_str(name, lock->name);
0063 __entry->lockdep_addr = lock;
0064 ),
0065
0066 TP_printk("%p %s", __entry->lockdep_addr, __get_str(name))
0067 );
0068
0069 DEFINE_EVENT(lock, lock_release,
0070
0071 TP_PROTO(struct lockdep_map *lock, unsigned long ip),
0072
0073 TP_ARGS(lock, ip)
0074 );
0075
0076 #ifdef CONFIG_LOCK_STAT
0077
0078 DEFINE_EVENT(lock, lock_contended,
0079
0080 TP_PROTO(struct lockdep_map *lock, unsigned long ip),
0081
0082 TP_ARGS(lock, ip)
0083 );
0084
0085 DEFINE_EVENT(lock, lock_acquired,
0086
0087 TP_PROTO(struct lockdep_map *lock, unsigned long ip),
0088
0089 TP_ARGS(lock, ip)
0090 );
0091
0092 #endif
0093 #endif
0094
0095 TRACE_EVENT(contention_begin,
0096
0097 TP_PROTO(void *lock, unsigned int flags),
0098
0099 TP_ARGS(lock, flags),
0100
0101 TP_STRUCT__entry(
0102 __field(void *, lock_addr)
0103 __field(unsigned int, flags)
0104 ),
0105
0106 TP_fast_assign(
0107 __entry->lock_addr = lock;
0108 __entry->flags = flags;
0109 ),
0110
0111 TP_printk("%p (flags=%s)", __entry->lock_addr,
0112 __print_flags(__entry->flags, "|",
0113 { LCB_F_SPIN, "SPIN" },
0114 { LCB_F_READ, "READ" },
0115 { LCB_F_WRITE, "WRITE" },
0116 { LCB_F_RT, "RT" },
0117 { LCB_F_PERCPU, "PERCPU" },
0118 { LCB_F_MUTEX, "MUTEX" }
0119 ))
0120 );
0121
0122 TRACE_EVENT(contention_end,
0123
0124 TP_PROTO(void *lock, int ret),
0125
0126 TP_ARGS(lock, ret),
0127
0128 TP_STRUCT__entry(
0129 __field(void *, lock_addr)
0130 __field(int, ret)
0131 ),
0132
0133 TP_fast_assign(
0134 __entry->lock_addr = lock;
0135 __entry->ret = ret;
0136 ),
0137
0138 TP_printk("%p (ret=%d)", __entry->lock_addr, __entry->ret)
0139 );
0140
0141 #endif
0142
0143
0144 #include <trace/define_trace.h>