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