Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2020 Marvell International Ltd.
3 : : */
4 : :
5 : : #ifndef _RTE_TRACE_POINT_H_
6 : : #define _RTE_TRACE_POINT_H_
7 : :
8 : : /**
9 : : * @file
10 : : *
11 : : * RTE Tracepoint API
12 : : *
13 : : * This file provides the tracepoint API to RTE applications.
14 : : *
15 : : * @warning
16 : : * @b EXPERIMENTAL: this API may change without prior notice
17 : : */
18 : :
19 : : #include <stdbool.h>
20 : : #include <stdio.h>
21 : :
22 : : #include <rte_branch_prediction.h>
23 : : #include <rte_common.h>
24 : : #include <rte_compat.h>
25 : : #include <rte_cycles.h>
26 : : #include <rte_per_lcore.h>
27 : : #include <rte_stdatomic.h>
28 : : #include <rte_string_fns.h>
29 : : #include <rte_trace.h>
30 : : #include <rte_uuid.h>
31 : :
32 : : #ifdef __cplusplus
33 : : extern "C" {
34 : : #endif
35 : :
36 : : /** The tracepoint object. */
37 : : typedef RTE_ATOMIC(uint64_t) rte_trace_point_t;
38 : :
39 : : #ifndef _RTE_TRACE_POINT_REGISTER_H_
40 : :
41 : : /**
42 : : * Macro to define the tracepoint arguments in RTE_TRACE_POINT macro.
43 : :
44 : : * @see RTE_TRACE_POINT, RTE_TRACE_POINT_FP
45 : : */
46 : : #define RTE_TRACE_POINT_ARGS
47 : :
48 : : /** @internal Helper macro to support RTE_TRACE_POINT and RTE_TRACE_POINT_FP */
49 : : #define __RTE_TRACE_POINT(_mode, _tp, _args, ...) \
50 : : extern rte_trace_point_t __##_tp; \
51 : : static __rte_always_inline void \
52 : : _tp _args \
53 : : { \
54 : : __rte_trace_point_emit_header_##_mode(&__##_tp); \
55 : : __VA_ARGS__ \
56 : : }
57 : :
58 : : #endif /* _RTE_TRACE_POINT_REGISTER_H_ */
59 : :
60 : : /**
61 : : * Create a tracepoint.
62 : : *
63 : : * A tracepoint is defined by specifying:
64 : : * - its input arguments: they are the C function style parameters to define
65 : : * the arguments of tracepoint function. These input arguments are embedded
66 : : * using the RTE_TRACE_POINT_ARGS macro.
67 : : * - its output event fields: they are the sources of event fields that form
68 : : * the payload of any event that the execution of the tracepoint macro emits
69 : : * for this particular tracepoint. The application uses
70 : : * rte_trace_point_emit_* macros to emit the output event fields.
71 : : *
72 : : * @param tp
73 : : * Tracepoint object. Before using the tracepoint, an application needs to
74 : : * define the tracepoint using RTE_TRACE_POINT_REGISTER macro.
75 : : * @param args
76 : : * C function style input arguments to define the arguments to tracepoint
77 : : * function.
78 : : * @param ...
79 : : * Define the payload of trace function. The payload will be formed using
80 : : * rte_trace_point_emit_* macros. Use ";" delimiter between two payloads.
81 : : *
82 : : * @see RTE_TRACE_POINT_ARGS, RTE_TRACE_POINT_REGISTER, rte_trace_point_emit_*
83 : : */
84 : : #define RTE_TRACE_POINT(tp, args, ...) \
85 : : __RTE_TRACE_POINT(generic, tp, args, __VA_ARGS__)
86 : :
87 : : /**
88 : : * Create a tracepoint for fast path.
89 : : *
90 : : * Similar to RTE_TRACE_POINT, except that it is removed at compilation time
91 : : * unless the RTE_ENABLE_TRACE_FP configuration parameter is set.
92 : : *
93 : : * @param tp
94 : : * Tracepoint object. Before using the tracepoint, an application needs to
95 : : * define the tracepoint using RTE_TRACE_POINT_REGISTER macro.
96 : : * @param args
97 : : * C function style input arguments to define the arguments to tracepoint.
98 : : * function.
99 : : * @param ...
100 : : * Define the payload of trace function. The payload will be formed using
101 : : * rte_trace_point_emit_* macros, Use ";" delimiter between two payloads.
102 : : *
103 : : * @see RTE_TRACE_POINT
104 : : */
105 : : #define RTE_TRACE_POINT_FP(tp, args, ...) \
106 : : __RTE_TRACE_POINT(fp, tp, args, __VA_ARGS__)
107 : :
108 : : #ifdef __DOXYGEN__
109 : :
110 : : /**
111 : : * Register a tracepoint.
112 : : *
113 : : * @param trace
114 : : * The tracepoint object created using RTE_TRACE_POINT_REGISTER.
115 : : * @param name
116 : : * The name of the tracepoint object.
117 : : * @return
118 : : * - 0: Successfully registered the tracepoint.
119 : : * - <0: Failure to register the tracepoint.
120 : : */
121 : : #define RTE_TRACE_POINT_REGISTER(trace, name)
122 : :
123 : : /** Tracepoint function payload for uint64_t datatype */
124 : : #define rte_trace_point_emit_u64(val)
125 : : /** Tracepoint function payload for int64_t datatype */
126 : : #define rte_trace_point_emit_i64(val)
127 : : /** Tracepoint function payload for uint32_t datatype */
128 : : #define rte_trace_point_emit_u32(val)
129 : : /** Tracepoint function payload for int32_t datatype */
130 : : #define rte_trace_point_emit_i32(val)
131 : : /** Tracepoint function payload for uint16_t datatype */
132 : : #define rte_trace_point_emit_u16(val)
133 : : /** Tracepoint function payload for int16_t datatype */
134 : : #define rte_trace_point_emit_i16(val)
135 : : /** Tracepoint function payload for uint8_t datatype */
136 : : #define rte_trace_point_emit_u8(val)
137 : : /** Tracepoint function payload for int8_t datatype */
138 : : #define rte_trace_point_emit_i8(val)
139 : : /** Tracepoint function payload for int datatype */
140 : : #define rte_trace_point_emit_int(val)
141 : : /** Tracepoint function payload for long datatype */
142 : : #define rte_trace_point_emit_long(val)
143 : : /** Tracepoint function payload for size_t datatype */
144 : : #define rte_trace_point_emit_size_t(val)
145 : : /** Tracepoint function payload for float datatype */
146 : : #define rte_trace_point_emit_float(val)
147 : : /** Tracepoint function payload for double datatype */
148 : : #define rte_trace_point_emit_double(val)
149 : : /** Tracepoint function payload for pointer datatype */
150 : : #define rte_trace_point_emit_ptr(val)
151 : : /** Tracepoint function payload for string datatype */
152 : : #define rte_trace_point_emit_string(val)
153 : : /**
154 : : * Tracepoint function to capture a blob.
155 : : *
156 : : * @param val
157 : : * Pointer to the array to be captured.
158 : : * @param len
159 : : * Length to be captured. The maximum supported length is
160 : : * RTE_TRACE_BLOB_LEN_MAX bytes.
161 : : */
162 : : #define rte_trace_point_emit_blob(val, len)
163 : :
164 : : #endif /* __DOXYGEN__ */
165 : :
166 : : /** @internal Macro to define maximum emit length of string datatype. */
167 : : #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32
168 : : /** @internal Macro to define event header size. */
169 : : #define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t)
170 : :
171 : : /** Macro to define maximum emit length of blob. */
172 : : #define RTE_TRACE_BLOB_LEN_MAX 64
173 : :
174 : : /**
175 : : * Enable recording events of the given tracepoint in the trace buffer.
176 : : *
177 : : * @param tp
178 : : * The tracepoint object to enable.
179 : : * @return
180 : : * - 0: Success.
181 : : * - (-ERANGE): Trace object is not registered.
182 : : */
183 : : __rte_experimental
184 : : int rte_trace_point_enable(rte_trace_point_t *tp);
185 : :
186 : : /**
187 : : * Disable recording events of the given tracepoint in the trace buffer.
188 : : *
189 : : * @param tp
190 : : * The tracepoint object to disable.
191 : : * @return
192 : : * - 0: Success.
193 : : * - (-ERANGE): Trace object is not registered.
194 : : */
195 : : __rte_experimental
196 : : int rte_trace_point_disable(rte_trace_point_t *tp);
197 : :
198 : : /**
199 : : * Test if recording events from the given tracepoint is enabled.
200 : : *
201 : : * @param tp
202 : : * The tracepoint object.
203 : : * @return
204 : : * true if tracepoint is enabled, false otherwise.
205 : : */
206 : : __rte_experimental
207 : : bool rte_trace_point_is_enabled(rte_trace_point_t *tp);
208 : :
209 : : /**
210 : : * Lookup a tracepoint object from its name.
211 : : *
212 : : * @param name
213 : : * The name of the tracepoint.
214 : : * @return
215 : : * The tracepoint object or NULL if not found.
216 : : */
217 : : __rte_experimental
218 : : rte_trace_point_t *rte_trace_point_lookup(const char *name);
219 : :
220 : : /**
221 : : * @internal
222 : : *
223 : : * Test if the tracepoint fast path compile-time option is enabled.
224 : : *
225 : : * @return
226 : : * true if tracepoint fast path enabled, false otherwise.
227 : : */
228 : : __rte_experimental
229 : : static __rte_always_inline bool
230 : : __rte_trace_point_fp_is_enabled(void)
231 : : {
232 : : #ifdef RTE_ENABLE_TRACE_FP
233 : : return true;
234 : : #else
235 : : return false;
236 : : #endif
237 : : }
238 : :
239 : : /**
240 : : * @internal
241 : : *
242 : : * Allocate trace memory buffer per thread.
243 : : */
244 : : __rte_experimental
245 : : void __rte_trace_mem_per_thread_alloc(void);
246 : :
247 : : /**
248 : : * @internal
249 : : *
250 : : * Helper function to emit field.
251 : : *
252 : : * @param sz
253 : : * The tracepoint size.
254 : : * @param field
255 : : * The name of the trace event.
256 : : * @param type
257 : : * The datatype of the trace event as string.
258 : : * @return
259 : : * - 0: Success.
260 : : * - <0: Failure.
261 : : */
262 : : __rte_experimental
263 : : void __rte_trace_point_emit_field(size_t sz, const char *field,
264 : : const char *type);
265 : :
266 : : /**
267 : : * @internal
268 : : *
269 : : * Helper function to register a dynamic tracepoint.
270 : : * Use RTE_TRACE_POINT_REGISTER macro for tracepoint registration.
271 : : *
272 : : * @param trace
273 : : * The tracepoint object created using RTE_TRACE_POINT_REGISTER.
274 : : * @param name
275 : : * The name of the tracepoint object.
276 : : * @param register_fn
277 : : * Trace registration function.
278 : : * @return
279 : : * - 0: Successfully registered the tracepoint.
280 : : * - <0: Failure to register the tracepoint.
281 : : */
282 : : __rte_experimental
283 : : int __rte_trace_point_register(rte_trace_point_t *trace, const char *name,
284 : : void (*register_fn)(void));
285 : :
286 : : #ifndef __DOXYGEN__
287 : :
288 : : #ifndef _RTE_TRACE_POINT_REGISTER_H_
289 : : #ifdef ALLOW_EXPERIMENTAL_API
290 : :
291 : : #define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48)
292 : :
293 : : #define __RTE_TRACE_FIELD_SIZE_SHIFT 0
294 : : #define __RTE_TRACE_FIELD_SIZE_MASK (0xffffULL << __RTE_TRACE_FIELD_SIZE_SHIFT)
295 : : #define __RTE_TRACE_FIELD_ID_SHIFT (16)
296 : : #define __RTE_TRACE_FIELD_ID_MASK (0xffffULL << __RTE_TRACE_FIELD_ID_SHIFT)
297 : : #define __RTE_TRACE_FIELD_ENABLE_MASK (1ULL << 63)
298 : : #define __RTE_TRACE_FIELD_ENABLE_DISCARD (1ULL << 62)
299 : :
300 : : struct __rte_trace_stream_header {
301 : : uint32_t magic;
302 : : rte_uuid_t uuid;
303 : : uint32_t lcore_id;
304 : : char thread_name[__RTE_TRACE_EMIT_STRING_LEN_MAX];
305 : : };
306 : :
307 : : struct __rte_trace_header {
308 : : uint32_t offset;
309 : : uint32_t len;
310 : : struct __rte_trace_stream_header stream_header;
311 : : uint8_t mem[];
312 : : };
313 : :
314 : : RTE_DECLARE_PER_LCORE(void *, trace_mem);
315 : :
316 : : static __rte_always_inline void *
317 : : __rte_trace_mem_get(uint64_t in)
318 : : {
319 : 34 : struct __rte_trace_header *trace =
320 : : (struct __rte_trace_header *)(RTE_PER_LCORE(trace_mem));
321 : 34 : const uint16_t sz = in & __RTE_TRACE_FIELD_SIZE_MASK;
322 : :
323 : : /* Trace memory is not initialized for this thread */
324 [ - + - + : 34 : if (unlikely(trace == NULL)) {
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
+ + # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
325 : 1 : __rte_trace_mem_per_thread_alloc();
326 : 1 : trace = (struct __rte_trace_header *)(RTE_PER_LCORE(trace_mem));
327 [ - - - - : 1 : if (unlikely(trace == NULL))
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
+ - # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
328 : : return NULL;
329 : : }
330 : : /* Check the wrap around case */
331 : 34 : uint32_t offset = trace->offset;
332 [ - + - + : 34 : if (unlikely((offset + sz) >= trace->len)) {
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- + # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
333 : : /* Disable the trace event if it in DISCARD mode */
334 [ # # # # : 0 : if (unlikely(in & __RTE_TRACE_FIELD_ENABLE_DISCARD))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
335 : : return NULL;
336 : :
337 : : offset = 0;
338 : : }
339 : : /* Align to event header size */
340 : 34 : offset = RTE_ALIGN_CEIL(offset, __RTE_TRACE_EVENT_HEADER_SZ);
341 : 34 : void *mem = RTE_PTR_ADD(&trace->mem[0], offset);
342 : 34 : offset += sz;
343 : 34 : trace->offset = offset;
344 : :
345 : 34 : return mem;
346 : : }
347 : :
348 : : static __rte_always_inline void *
349 : : __rte_trace_point_emit_ev_header(void *mem, uint64_t in)
350 : : {
351 : : uint64_t val;
352 : :
353 : : /* Event header [63:0] = id [63:48] | timestamp [47:0] */
354 : 34 : val = rte_get_tsc_cycles() &
355 : : ~(0xffffULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT);
356 : 34 : val |= ((in & __RTE_TRACE_FIELD_ID_MASK) <<
357 : : (__RTE_TRACE_EVENT_HEADER_ID_SHIFT -
358 : : __RTE_TRACE_FIELD_ID_SHIFT));
359 : :
360 : 12 : *(uint64_t *)mem = val;
361 [ + - + - : 33 : return RTE_PTR_ADD(mem, __RTE_TRACE_EVENT_HEADER_SZ);
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
362 : : }
363 : :
364 : : #define __rte_trace_point_emit_header_generic(t) \
365 : : void *mem; \
366 : : do { \
367 : : if (!rte_trace_feature_is_enabled()) \
368 : : return; \
369 : : const uint64_t val = rte_atomic_load_explicit(t, rte_memory_order_acquire); \
370 : : if (likely(!(val & __RTE_TRACE_FIELD_ENABLE_MASK))) \
371 : : return; \
372 : : mem = __rte_trace_mem_get(val); \
373 : : if (unlikely(mem == NULL)) \
374 : : return; \
375 : : mem = __rte_trace_point_emit_ev_header(mem, val); \
376 : : } while (0)
377 : :
378 : : #define __rte_trace_point_emit_header_fp(t) \
379 : : if (!__rte_trace_point_fp_is_enabled()) \
380 : : return; \
381 : : __rte_trace_point_emit_header_generic(t)
382 : :
383 : : #define __rte_trace_point_emit(name, in, type) \
384 : : do { \
385 : : RTE_BUILD_BUG_ON(sizeof(type) != sizeof(typeof(*in))); \
386 : : memcpy(mem, in, sizeof(*in)); \
387 : : mem = RTE_PTR_ADD(mem, sizeof(*in)); \
388 : : } while (0)
389 : :
390 : : #define rte_trace_point_emit_string(in) \
391 : : do { \
392 : : if (unlikely(in == NULL)) \
393 : : return; \
394 : : rte_strscpy((char *)mem, in, __RTE_TRACE_EMIT_STRING_LEN_MAX); \
395 : : mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX); \
396 : : } while (0)
397 : :
398 : : #define rte_trace_point_emit_blob(in, len) \
399 : : do { \
400 : : uint8_t size = len; \
401 : : if (unlikely(in == NULL)) \
402 : : return; \
403 : : if (size > RTE_TRACE_BLOB_LEN_MAX) \
404 : : size = RTE_TRACE_BLOB_LEN_MAX; \
405 : : __rte_trace_point_emit("size", &size, uint8_t); \
406 : : memcpy(mem, in, size); \
407 : : memset(RTE_PTR_ADD(mem, size), 0, RTE_TRACE_BLOB_LEN_MAX - size); \
408 : : mem = RTE_PTR_ADD(mem, RTE_TRACE_BLOB_LEN_MAX); \
409 : : } while (0)
410 : :
411 : : #else
412 : :
413 : : #define __rte_trace_point_emit_header_generic(t) RTE_SET_USED(t)
414 : : #define __rte_trace_point_emit_header_fp(t) RTE_SET_USED(t)
415 : : #define __rte_trace_point_emit(name, in, type) RTE_SET_USED(in)
416 : : #define rte_trace_point_emit_string(in) RTE_SET_USED(in)
417 : : #define rte_trace_point_emit_blob(in, len) \
418 : : do { \
419 : : RTE_SET_USED(in); \
420 : : RTE_SET_USED(len); \
421 : : } while (0)
422 : :
423 : :
424 : : #endif /* ALLOW_EXPERIMENTAL_API */
425 : : #endif /* _RTE_TRACE_POINT_REGISTER_H_ */
426 : :
427 : : #define rte_trace_point_emit_u64(in) __rte_trace_point_emit(RTE_STR(in), &in, uint64_t)
428 : : #define rte_trace_point_emit_i64(in) __rte_trace_point_emit(RTE_STR(in), &in, int64_t)
429 : : #define rte_trace_point_emit_u32(in) __rte_trace_point_emit(RTE_STR(in), &in, uint32_t)
430 : : #define rte_trace_point_emit_i32(in) __rte_trace_point_emit(RTE_STR(in), &in, int32_t)
431 : : #define rte_trace_point_emit_u16(in) __rte_trace_point_emit(RTE_STR(in), &in, uint16_t)
432 : : #define rte_trace_point_emit_i16(in) __rte_trace_point_emit(RTE_STR(in), &in, int16_t)
433 : : #define rte_trace_point_emit_u8(in) __rte_trace_point_emit(RTE_STR(in), &in, uint8_t)
434 : : #define rte_trace_point_emit_i8(in) __rte_trace_point_emit(RTE_STR(in), &in, int8_t)
435 : : #define rte_trace_point_emit_int(in) __rte_trace_point_emit(RTE_STR(in), &in, int32_t)
436 : : #define rte_trace_point_emit_long(in) __rte_trace_point_emit(RTE_STR(in), &in, long)
437 : : #define rte_trace_point_emit_size_t(in) __rte_trace_point_emit(RTE_STR(in), &in, size_t)
438 : : #define rte_trace_point_emit_float(in) __rte_trace_point_emit(RTE_STR(in), &in, float)
439 : : #define rte_trace_point_emit_double(in) __rte_trace_point_emit(RTE_STR(in), &in, double)
440 : : #define rte_trace_point_emit_ptr(in) __rte_trace_point_emit(RTE_STR(in), &in, uintptr_t)
441 : :
442 : : #define rte_trace_point_emit_u64_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, uint64_t)
443 : : #define rte_trace_point_emit_i64_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, int64_t)
444 : : #define rte_trace_point_emit_u32_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, uint32_t)
445 : : #define rte_trace_point_emit_i32_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, int32_t)
446 : : #define rte_trace_point_emit_u16_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, uint16_t)
447 : : #define rte_trace_point_emit_i16_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, int16_t)
448 : : #define rte_trace_point_emit_u8_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, uint8_t)
449 : : #define rte_trace_point_emit_i8_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, int8_t)
450 : : #define rte_trace_point_emit_int_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, int32_t)
451 : : #define rte_trace_point_emit_long_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, long)
452 : : #define rte_trace_point_emit_size_t_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, size_t)
453 : : #define rte_trace_point_emit_float_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, float)
454 : : #define rte_trace_point_emit_double_ptr(in) __rte_trace_point_emit(RTE_STR(in)"_val", in, double)
455 : :
456 : : #endif /* __DOXYGEN__ */
457 : :
458 : : #ifdef __cplusplus
459 : : }
460 : : #endif
461 : :
462 : : #endif /* _RTE_TRACE_POINT_H_ */
|