1 // SPDX-License-Identifier: GPL-2.0
2 #ifndef PERF_LOCK_CONTENTION_H
3 #define PERF_LOCK_CONTENTION_H
5 #include <linux/list.h>
6 #include <linux/rbtree.h>
20 struct hlist_node hash_entry
;
21 struct rb_node rb
; /* used for sorting */
23 u64 addr
; /* address of lockdep_map, used as ID */
24 char *name
; /* for strcpy(), we cannot use const */
27 unsigned int nr_acquire
;
28 unsigned int nr_acquired
;
29 unsigned int nr_contended
;
30 unsigned int nr_release
;
33 unsigned int nr_readlock
;
36 unsigned int nr_trylock
;
38 /* these times are in nano sec. */
44 int broken
; /* flag of blacklist */
49 * States of lock_seq_stat
51 * UNINITIALIZED is required for detecting first event of acquire.
52 * As the nature of lock events, there is no guarantee
53 * that the first event for the locks are acquire,
54 * it can be acquired, contended or release.
56 #define SEQ_STATE_UNINITIALIZED 0 /* initial state */
57 #define SEQ_STATE_RELEASED 1
58 #define SEQ_STATE_ACQUIRING 2
59 #define SEQ_STATE_ACQUIRED 3
60 #define SEQ_STATE_READ_ACQUIRED 4
61 #define SEQ_STATE_CONTENDED 5
65 * Imported from include/linux/sched.h.
66 * Should this be synchronized?
68 #define MAX_LOCK_DEPTH 48
70 struct lock_stat
*lock_stat_find(u64 addr
);
71 struct lock_stat
*lock_stat_findnew(u64 addr
, const char *name
, int flags
);
73 bool match_callstack_filter(struct machine
*machine
, u64
*callstack
);
76 * struct lock_seq_stat:
77 * Place to put on state of one lock sequence
78 * 1) acquire -> acquired -> release
79 * 2) acquire -> contended -> acquired -> release
80 * 3) acquire (with read or try) -> release
81 * 4) Are there other patterns?
83 struct lock_seq_stat
{
84 struct list_head list
;
96 struct list_head seq_list
;
100 * CONTENTION_STACK_DEPTH
101 * Number of stack trace entries to find callers
103 #define CONTENTION_STACK_DEPTH 8
106 * CONTENTION_STACK_SKIP
107 * Number of stack trace entries to skip when finding callers.
108 * The first few entries belong to the locking implementation itself.
110 #define CONTENTION_STACK_SKIP 4
113 * flags for lock:contention_begin
114 * Imported from include/trace/events/lock.h.
116 #define LCB_F_SPIN (1U << 0)
117 #define LCB_F_READ (1U << 1)
118 #define LCB_F_WRITE (1U << 2)
119 #define LCB_F_RT (1U << 3)
120 #define LCB_F_PERCPU (1U << 4)
121 #define LCB_F_MUTEX (1U << 5)
127 struct lock_contention_fails
{
134 struct lock_contention
{
135 struct evlist
*evlist
;
136 struct target
*target
;
137 struct machine
*machine
;
138 struct hlist_head
*result
;
139 struct lock_filter
*filters
;
140 struct lock_contention_fails fails
;
141 struct rb_root cgroups
;
142 unsigned long map_nr_entries
;
153 int lock_contention_prepare(struct lock_contention
*con
);
154 int lock_contention_start(void);
155 int lock_contention_stop(void);
156 int lock_contention_read(struct lock_contention
*con
);
157 int lock_contention_finish(struct lock_contention
*con
);
159 #else /* !HAVE_BPF_SKEL */
161 static inline int lock_contention_prepare(struct lock_contention
*con __maybe_unused
)
166 static inline int lock_contention_start(void) { return 0; }
167 static inline int lock_contention_stop(void) { return 0; }
168 static inline int lock_contention_finish(struct lock_contention
*con __maybe_unused
)
173 static inline int lock_contention_read(struct lock_contention
*con __maybe_unused
)
178 #endif /* HAVE_BPF_SKEL */
180 #endif /* PERF_LOCK_CONTENTION_H */