]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/examples/performance-thread/common/lthread_diag_api.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / dpdk / examples / performance-thread / common / lthread_diag_api.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015 Intel Corporation
3 */
4 #ifndef LTHREAD_DIAG_API_H_
5 #define LTHREAD_DIAG_API_H_
6
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10
11 #include <stdint.h>
12 #include <inttypes.h>
13
14 /*
15 * Enable diagnostics
16 * 0 = conditionally compiled out
17 * 1 = compiled in and maskable at run time, see below for details
18 */
19 #define LTHREAD_DIAG 0
20
21 /**
22 *
23 * @file lthread_diag_api.h
24 *
25 * @warning
26 * @b EXPERIMENTAL: this API may change without prior notice
27 *
28 * lthread diagnostic interface
29 *
30 * If enabled via configuration file option ( tbd ) the lthread subsystem
31 * can generate selected trace information, either RTE_LOG (INFO) messages,
32 * or else invoke a user supplied callback function when any of the events
33 * listed below occur.
34 *
35 * Reporting of events can be selectively masked, the bit position in the
36 * mask is determined by the corresponding event identifier listed below.
37 *
38 * Diagnostics are enabled by registering the callback function and mask
39 * using the API lthread_diagnostic_enable().
40 *
41 * Various interesting parameters are passed to the callback, including the
42 * time in cpu clks, the lthread id, the diagnostic event id, a user ref value,
43 * event text string, object being traced, and two context dependent parameters
44 * (p1 and p2). The meaning of the two parameters p1 and p2 depends on
45 * the specific event.
46 *
47 * The events LT_DIAG_LTHREAD_CREATE, LT_DIAG_MUTEX_CREATE and
48 * LT_DIAG_COND_CREATE are implicitly enabled if the event mask includes any of
49 * the LT_DIAG_LTHREAD_XXX, LT_DIAG_MUTEX_XXX or LT_DIAG_COND_XXX events
50 * respectively.
51 *
52 * These create events may also be included in the mask discreetly if it is
53 * desired to monitor only create events.
54 *
55 * @param time
56 * The time in cpu clks at which the event occurred
57 *
58 * @param lthread
59 * The current lthread
60 *
61 * @param diag_event
62 * The diagnostic event id (bit position in the mask)
63 *
64 * @param diag_ref
65 *
66 * For LT_DIAG_LTHREAD_CREATE, LT_DIAG_MUTEX_CREATE or LT_DIAG_COND_CREATE
67 * this parameter is not used and set to 0.
68 * All other events diag_ref contains the user ref value returned by the
69 * callback function when lthread is created.
70 *
71 * The diag_ref values assigned to mutex and cond var can be retrieved
72 * using the APIs lthread_mutex_diag_ref(), and lthread_cond_diag_ref()
73 * respectively.
74 *
75 * @param p1
76 * see below
77 *
78 * @param p1
79 * see below
80 *
81 * @returns
82 * For LT_DIAG_LTHREAD_CREATE, LT_DIAG_MUTEX_CREATE or LT_DIAG_COND_CREATE
83 * expects a user diagnostic ref value that will be saved in the lthread, mutex
84 * or cond var.
85 *
86 * For all other events return value is ignored.
87 *
88 * LT_DIAG_SCHED_CREATE - Invoked when a scheduler is created
89 * p1 = the scheduler that was created
90 * p2 = not used
91 * return value will be ignored
92 *
93 * LT_DIAG_SCHED_SHUTDOWN - Invoked when a shutdown request is received
94 * p1 = the scheduler to be shutdown
95 * p2 = not used
96 * return value will be ignored
97 *
98 * LT_DIAG_LTHREAD_CREATE - Invoked when a thread is created
99 * p1 = the lthread that was created
100 * p2 = not used
101 * return value will be stored in the lthread
102 *
103 * LT_DIAG_LTHREAD_EXIT - Invoked when a lthread exits
104 * p2 = 0 if the thread was already joined
105 * p2 = 1 if the thread was not already joined
106 * return val ignored
107 *
108 * LT_DIAG_LTHREAD_JOIN - Invoked when a lthread exits
109 * p1 = the lthread that is being joined
110 * p2 = 0 if the thread was already exited
111 * p2 = 1 if the thread was not already exited
112 * return val ignored
113 *
114 * LT_DIAG_LTHREAD_CANCELLED - Invoked when an lthread is cancelled
115 * p1 = not used
116 * p2 = not used
117 * return val ignored
118 *
119 * LT_DIAG_LTHREAD_DETACH - Invoked when an lthread is detached
120 * p1 = not used
121 * p2 = not used
122 * return val ignored
123 *
124 * LT_DIAG_LTHREAD_FREE - Invoked when an lthread is freed
125 * p1 = not used
126 * p2 = not used
127 * return val ignored
128 *
129 * LT_DIAG_LTHREAD_SUSPENDED - Invoked when an lthread is suspended
130 * p1 = not used
131 * p2 = not used
132 * return val ignored
133 *
134 * LT_DIAG_LTHREAD_YIELD - Invoked when an lthread explicitly yields
135 * p1 = not used
136 * p2 = not used
137 * return val ignored
138 *
139 * LT_DIAG_LTHREAD_RESCHEDULED - Invoked when an lthread is rescheduled
140 * p1 = not used
141 * p2 = not used
142 * return val ignored
143 *
144 * LT_DIAG_LTHREAD_RESUMED - Invoked when an lthread is resumed
145 * p1 = not used
146 * p2 = not used
147 * return val ignored
148 *
149 * LT_DIAG_LTHREAD_AFFINITY - Invoked when an lthread is affinitised
150 * p1 = the destination lcore_id
151 * p2 = not used
152 * return val ignored
153 *
154 * LT_DIAG_LTHREAD_TMR_START - Invoked when an lthread starts a timer
155 * p1 = address of timer node
156 * p2 = the timeout value
157 * return val ignored
158 *
159 * LT_DIAG_LTHREAD_TMR_DELETE - Invoked when an lthread deletes a timer
160 * p1 = address of the timer node
161 * p2 = 0 the timer and the was successfully deleted
162 * p2 = not usee
163 * return val ignored
164 *
165 * LT_DIAG_LTHREAD_TMR_EXPIRED - Invoked when an lthread timer expires
166 * p1 = address of scheduler the timer expired on
167 * p2 = the thread associated with the timer
168 * return val ignored
169 *
170 * LT_DIAG_COND_CREATE - Invoked when a condition variable is created
171 * p1 = address of cond var that was created
172 * p2 = not used
173 * return diag ref value will be stored in the condition variable
174 *
175 * LT_DIAG_COND_DESTROY - Invoked when a condition variable is destroyed
176 * p1 = not used
177 * p2 = not used
178 * return val ignored
179 *
180 * LT_DIAG_COND_WAIT - Invoked when an lthread waits on a cond var
181 * p1 = the address of the condition variable
182 * p2 = not used
183 * return val ignored
184 *
185 * LT_DIAG_COND_SIGNAL - Invoked when an lthread signals a cond var
186 * p1 = the address of the cond var
187 * p2 = the lthread that was signalled, or error code
188 * return val ignored
189 *
190 * LT_DIAG_COND_BROADCAST - Invoked when an lthread broadcasts a cond var
191 * p1 = the address of the condition variable
192 * p2 = the lthread(s) that are signalled, or error code
193 *
194 * LT_DIAG_MUTEX_CREATE - Invoked when a mutex is created
195 * p1 = address of muex
196 * p2 = not used
197 * return diag ref value will be stored in the mutex variable
198 *
199 * LT_DIAG_MUTEX_DESTROY - Invoked when a mutex is destroyed
200 * p1 = address of mutex
201 * p2 = not used
202 * return val ignored
203 *
204 * LT_DIAG_MUTEX_LOCK - Invoked when a mutex lock is obtained
205 * p1 = address of mutex
206 * p2 = function return value
207 * return val ignored
208 *
209 * LT_DIAG_MUTEX_BLOCKED - Invoked when an lthread blocks on a mutex
210 * p1 = address of mutex
211 * p2 = function return value
212 * return val ignored
213 *
214 * LT_DIAG_MUTEX_TRYLOCK - Invoked when a mutex try lock is attempted
215 * p1 = address of mutex
216 * p2 = the function return value
217 * return val ignored
218 *
219 * LT_DIAG_MUTEX_UNLOCKED - Invoked when a mutex is unlocked
220 * p1 = address of mutex
221 * p2 = the thread that was unlocked, or error code
222 * return val ignored
223 */
224 typedef uint64_t (*diag_callback) (uint64_t time, struct lthread *lt,
225 int diag_event, uint64_t diag_ref,
226 const char *text, uint64_t p1, uint64_t p2);
227
228 /*
229 * Set user diagnostic callback and mask
230 * If the callback function pointer is NULL the default
231 * callback handler will be restored.
232 */
233 void lthread_diagnostic_enable(diag_callback cb, uint64_t diag_mask);
234
235 /*
236 * Set diagnostic mask
237 */
238 void lthread_diagnostic_set_mask(uint64_t mask);
239
240 /*
241 * lthread diagnostic callback
242 */
243 enum lthread_diag_ev {
244 /* bits 0 - 14 lthread flag group */
245 LT_DIAG_LTHREAD_CREATE, /* 00 mask 0x00000001 */
246 LT_DIAG_LTHREAD_EXIT, /* 01 mask 0x00000002 */
247 LT_DIAG_LTHREAD_JOIN, /* 02 mask 0x00000004 */
248 LT_DIAG_LTHREAD_CANCEL, /* 03 mask 0x00000008 */
249 LT_DIAG_LTHREAD_DETACH, /* 04 mask 0x00000010 */
250 LT_DIAG_LTHREAD_FREE, /* 05 mask 0x00000020 */
251 LT_DIAG_LTHREAD_SUSPENDED, /* 06 mask 0x00000040 */
252 LT_DIAG_LTHREAD_YIELD, /* 07 mask 0x00000080 */
253 LT_DIAG_LTHREAD_RESCHEDULED, /* 08 mask 0x00000100 */
254 LT_DIAG_LTHREAD_SLEEP, /* 09 mask 0x00000200 */
255 LT_DIAG_LTHREAD_RESUMED, /* 10 mask 0x00000400 */
256 LT_DIAG_LTHREAD_AFFINITY, /* 11 mask 0x00000800 */
257 LT_DIAG_LTHREAD_TMR_START, /* 12 mask 0x00001000 */
258 LT_DIAG_LTHREAD_TMR_DELETE, /* 13 mask 0x00002000 */
259 LT_DIAG_LTHREAD_TMR_EXPIRED, /* 14 mask 0x00004000 */
260 /* bits 15 - 19 conditional variable flag group */
261 LT_DIAG_COND_CREATE, /* 15 mask 0x00008000 */
262 LT_DIAG_COND_DESTROY, /* 16 mask 0x00010000 */
263 LT_DIAG_COND_WAIT, /* 17 mask 0x00020000 */
264 LT_DIAG_COND_SIGNAL, /* 18 mask 0x00040000 */
265 LT_DIAG_COND_BROADCAST, /* 19 mask 0x00080000 */
266 /* bits 20 - 25 mutex flag group */
267 LT_DIAG_MUTEX_CREATE, /* 20 mask 0x00100000 */
268 LT_DIAG_MUTEX_DESTROY, /* 21 mask 0x00200000 */
269 LT_DIAG_MUTEX_LOCK, /* 22 mask 0x00400000 */
270 LT_DIAG_MUTEX_TRYLOCK, /* 23 mask 0x00800000 */
271 LT_DIAG_MUTEX_BLOCKED, /* 24 mask 0x01000000 */
272 LT_DIAG_MUTEX_UNLOCKED, /* 25 mask 0x02000000 */
273 /* bits 26 - 27 scheduler flag group - 8 bits */
274 LT_DIAG_SCHED_CREATE, /* 26 mask 0x04000000 */
275 LT_DIAG_SCHED_SHUTDOWN, /* 27 mask 0x08000000 */
276 LT_DIAG_EVENT_MAX
277 };
278
279 #define LT_DIAG_ALL 0xffffffffffffffff
280
281
282 /*
283 * Display scheduler stats
284 */
285 void
286 lthread_sched_stats_display(void);
287
288 /*
289 * return the diagnostic ref val stored in a condition var
290 */
291 uint64_t
292 lthread_cond_diag_ref(struct lthread_cond *c);
293
294 /*
295 * return the diagnostic ref val stored in a mutex
296 */
297 uint64_t
298 lthread_mutex_diag_ref(struct lthread_mutex *m);
299
300 #ifdef __cplusplus
301 }
302 #endif
303
304 #endif /* LTHREAD_DIAG_API_H_ */