Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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 /* flags for lock:contention_begin */
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 /* CONFIG_LOCK_STAT */
0093 #endif /* CONFIG_LOCKDEP */
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 /* _TRACE_LOCK_H */
0142 
0143 /* This part must be outside protection */
0144 #include <trace/define_trace.h>