xref: /dpdk/lib/eal/include/rte_trace_point.h (revision 5dc68f2be8adea7aad24dc56dad57ec9a3bfe413)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(C) 2020 Marvell International Ltd.
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_TRACE_POINT_H_
699a2dd95SBruce Richardson #define _RTE_TRACE_POINT_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson /**
999a2dd95SBruce Richardson  * @file
1099a2dd95SBruce Richardson  *
1199a2dd95SBruce Richardson  * RTE Tracepoint API
1299a2dd95SBruce Richardson  *
1399a2dd95SBruce Richardson  * This file provides the tracepoint API to RTE applications.
1499a2dd95SBruce Richardson  *
1599a2dd95SBruce Richardson  * @warning
1699a2dd95SBruce Richardson  * @b EXPERIMENTAL: this API may change without prior notice
1799a2dd95SBruce Richardson  */
1899a2dd95SBruce Richardson 
1999a2dd95SBruce Richardson #include <stdbool.h>
2099a2dd95SBruce Richardson #include <stdio.h>
2199a2dd95SBruce Richardson 
2299a2dd95SBruce Richardson #include <rte_branch_prediction.h>
2399a2dd95SBruce Richardson #include <rte_common.h>
2499a2dd95SBruce Richardson #include <rte_compat.h>
2599a2dd95SBruce Richardson #include <rte_cycles.h>
2699a2dd95SBruce Richardson #include <rte_per_lcore.h>
271ec6a845STyler Retzlaff #include <rte_stdatomic.h>
2899a2dd95SBruce Richardson #include <rte_string_fns.h>
29e7bc451cSMorten Brørup #include <rte_trace.h>
3099a2dd95SBruce Richardson #include <rte_uuid.h>
3199a2dd95SBruce Richardson 
32719834a6SMattias Rönnblom #ifdef __cplusplus
33719834a6SMattias Rönnblom extern "C" {
34719834a6SMattias Rönnblom #endif
35719834a6SMattias Rönnblom 
3699a2dd95SBruce Richardson /** The tracepoint object. */
371ec6a845STyler Retzlaff typedef RTE_ATOMIC(uint64_t) rte_trace_point_t;
3899a2dd95SBruce Richardson 
3999a2dd95SBruce Richardson /**
4099a2dd95SBruce Richardson  * Macro to define the tracepoint arguments in RTE_TRACE_POINT macro.
4199a2dd95SBruce Richardson 
4299a2dd95SBruce Richardson  * @see RTE_TRACE_POINT, RTE_TRACE_POINT_FP
4399a2dd95SBruce Richardson  */
4499a2dd95SBruce Richardson #define RTE_TRACE_POINT_ARGS
4599a2dd95SBruce Richardson 
4699a2dd95SBruce Richardson /** @internal Helper macro to support RTE_TRACE_POINT and RTE_TRACE_POINT_FP */
4799a2dd95SBruce Richardson #define __RTE_TRACE_POINT(_mode, _tp, _args, ...) \
4899a2dd95SBruce Richardson extern rte_trace_point_t __##_tp; \
4999a2dd95SBruce Richardson static __rte_always_inline void \
5099a2dd95SBruce Richardson _tp _args \
5199a2dd95SBruce Richardson { \
5299a2dd95SBruce Richardson 	__rte_trace_point_emit_header_##_mode(&__##_tp); \
5399a2dd95SBruce Richardson 	__VA_ARGS__ \
5499a2dd95SBruce Richardson }
5599a2dd95SBruce Richardson 
5699a2dd95SBruce Richardson /**
5799a2dd95SBruce Richardson  * Create a tracepoint.
5899a2dd95SBruce Richardson  *
5999a2dd95SBruce Richardson  * A tracepoint is defined by specifying:
6099a2dd95SBruce Richardson  * - its input arguments: they are the C function style parameters to define
6199a2dd95SBruce Richardson  *   the arguments of tracepoint function. These input arguments are embedded
6299a2dd95SBruce Richardson  *   using the RTE_TRACE_POINT_ARGS macro.
6399a2dd95SBruce Richardson  * - its output event fields: they are the sources of event fields that form
6499a2dd95SBruce Richardson  *   the payload of any event that the execution of the tracepoint macro emits
6599a2dd95SBruce Richardson  *   for this particular tracepoint. The application uses
6699a2dd95SBruce Richardson  *   rte_trace_point_emit_* macros to emit the output event fields.
6799a2dd95SBruce Richardson  *
6899a2dd95SBruce Richardson  * @param tp
6999a2dd95SBruce Richardson  *   Tracepoint object. Before using the tracepoint, an application needs to
7099a2dd95SBruce Richardson  *   define the tracepoint using RTE_TRACE_POINT_REGISTER macro.
7199a2dd95SBruce Richardson  * @param args
7299a2dd95SBruce Richardson  *   C function style input arguments to define the arguments to tracepoint
7399a2dd95SBruce Richardson  *   function.
7499a2dd95SBruce Richardson  * @param ...
7599a2dd95SBruce Richardson  *   Define the payload of trace function. The payload will be formed using
7699a2dd95SBruce Richardson  *   rte_trace_point_emit_* macros. Use ";" delimiter between two payloads.
7799a2dd95SBruce Richardson  *
7899a2dd95SBruce Richardson  * @see RTE_TRACE_POINT_ARGS, RTE_TRACE_POINT_REGISTER, rte_trace_point_emit_*
7999a2dd95SBruce Richardson  */
8099a2dd95SBruce Richardson #define RTE_TRACE_POINT(tp, args, ...) \
8199a2dd95SBruce Richardson 	__RTE_TRACE_POINT(generic, tp, args, __VA_ARGS__)
8299a2dd95SBruce Richardson 
8399a2dd95SBruce Richardson /**
8499a2dd95SBruce Richardson  * Create a tracepoint for fast path.
8599a2dd95SBruce Richardson  *
8699a2dd95SBruce Richardson  * Similar to RTE_TRACE_POINT, except that it is removed at compilation time
8799a2dd95SBruce Richardson  * unless the RTE_ENABLE_TRACE_FP configuration parameter is set.
8899a2dd95SBruce Richardson  *
8999a2dd95SBruce Richardson  * @param tp
9099a2dd95SBruce Richardson  *   Tracepoint object. Before using the tracepoint, an application needs to
9199a2dd95SBruce Richardson  *   define the tracepoint using RTE_TRACE_POINT_REGISTER macro.
9299a2dd95SBruce Richardson  * @param args
9399a2dd95SBruce Richardson  *   C function style input arguments to define the arguments to tracepoint.
9499a2dd95SBruce Richardson  *   function.
9599a2dd95SBruce Richardson  * @param ...
9699a2dd95SBruce Richardson  *   Define the payload of trace function. The payload will be formed using
9799a2dd95SBruce Richardson  *   rte_trace_point_emit_* macros, Use ";" delimiter between two payloads.
9899a2dd95SBruce Richardson  *
9999a2dd95SBruce Richardson  * @see RTE_TRACE_POINT
10099a2dd95SBruce Richardson  */
10199a2dd95SBruce Richardson #define RTE_TRACE_POINT_FP(tp, args, ...) \
10299a2dd95SBruce Richardson 	__RTE_TRACE_POINT(fp, tp, args, __VA_ARGS__)
10399a2dd95SBruce Richardson 
10499a2dd95SBruce Richardson #ifdef __DOXYGEN__
10599a2dd95SBruce Richardson 
10699a2dd95SBruce Richardson /**
10799a2dd95SBruce Richardson  * Register a tracepoint.
10899a2dd95SBruce Richardson  *
10999a2dd95SBruce Richardson  * @param trace
11099a2dd95SBruce Richardson  *   The tracepoint object created using RTE_TRACE_POINT_REGISTER.
11199a2dd95SBruce Richardson  * @param name
11299a2dd95SBruce Richardson  *   The name of the tracepoint object.
11399a2dd95SBruce Richardson  * @return
11499a2dd95SBruce Richardson  *   - 0: Successfully registered the tracepoint.
11599a2dd95SBruce Richardson  *   - <0: Failure to register the tracepoint.
11699a2dd95SBruce Richardson  */
11799a2dd95SBruce Richardson #define RTE_TRACE_POINT_REGISTER(trace, name)
11899a2dd95SBruce Richardson 
11999a2dd95SBruce Richardson /** Tracepoint function payload for uint64_t datatype */
12099a2dd95SBruce Richardson #define rte_trace_point_emit_u64(val)
12199a2dd95SBruce Richardson /** Tracepoint function payload for int64_t datatype */
12299a2dd95SBruce Richardson #define rte_trace_point_emit_i64(val)
12399a2dd95SBruce Richardson /** Tracepoint function payload for uint32_t datatype */
12499a2dd95SBruce Richardson #define rte_trace_point_emit_u32(val)
12599a2dd95SBruce Richardson /** Tracepoint function payload for int32_t datatype */
12699a2dd95SBruce Richardson #define rte_trace_point_emit_i32(val)
12799a2dd95SBruce Richardson /** Tracepoint function payload for uint16_t datatype */
12899a2dd95SBruce Richardson #define rte_trace_point_emit_u16(val)
12999a2dd95SBruce Richardson /** Tracepoint function payload for int16_t datatype */
13099a2dd95SBruce Richardson #define rte_trace_point_emit_i16(val)
13199a2dd95SBruce Richardson /** Tracepoint function payload for uint8_t datatype */
13299a2dd95SBruce Richardson #define rte_trace_point_emit_u8(val)
13399a2dd95SBruce Richardson /** Tracepoint function payload for int8_t datatype */
13499a2dd95SBruce Richardson #define rte_trace_point_emit_i8(val)
13599a2dd95SBruce Richardson /** Tracepoint function payload for int datatype */
13699a2dd95SBruce Richardson #define rte_trace_point_emit_int(val)
13799a2dd95SBruce Richardson /** Tracepoint function payload for long datatype */
13899a2dd95SBruce Richardson #define rte_trace_point_emit_long(val)
13999a2dd95SBruce Richardson /** Tracepoint function payload for size_t datatype */
14099a2dd95SBruce Richardson #define rte_trace_point_emit_size_t(val)
14199a2dd95SBruce Richardson /** Tracepoint function payload for float datatype */
14299a2dd95SBruce Richardson #define rte_trace_point_emit_float(val)
14399a2dd95SBruce Richardson /** Tracepoint function payload for double datatype */
14499a2dd95SBruce Richardson #define rte_trace_point_emit_double(val)
14599a2dd95SBruce Richardson /** Tracepoint function payload for pointer datatype */
14699a2dd95SBruce Richardson #define rte_trace_point_emit_ptr(val)
14799a2dd95SBruce Richardson /** Tracepoint function payload for string datatype */
14899a2dd95SBruce Richardson #define rte_trace_point_emit_string(val)
1494925e15aSAnkur Dwivedi /**
1504925e15aSAnkur Dwivedi  * Tracepoint function to capture a blob.
1514925e15aSAnkur Dwivedi  *
1524925e15aSAnkur Dwivedi  * @param val
1534925e15aSAnkur Dwivedi  *   Pointer to the array to be captured.
1544925e15aSAnkur Dwivedi  * @param len
1554925e15aSAnkur Dwivedi  *   Length to be captured. The maximum supported length is
1564925e15aSAnkur Dwivedi  *   RTE_TRACE_BLOB_LEN_MAX bytes.
1574925e15aSAnkur Dwivedi  */
1584925e15aSAnkur Dwivedi #define rte_trace_point_emit_blob(val, len)
15999a2dd95SBruce Richardson 
16099a2dd95SBruce Richardson #endif /* __DOXYGEN__ */
16199a2dd95SBruce Richardson 
16299a2dd95SBruce Richardson /** @internal Macro to define maximum emit length of string datatype. */
16399a2dd95SBruce Richardson #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32
16499a2dd95SBruce Richardson /** @internal Macro to define event header size. */
16599a2dd95SBruce Richardson #define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t)
16699a2dd95SBruce Richardson 
1674925e15aSAnkur Dwivedi /** Macro to define maximum emit length of blob. */
1684925e15aSAnkur Dwivedi #define RTE_TRACE_BLOB_LEN_MAX 64
1694925e15aSAnkur Dwivedi 
17099a2dd95SBruce Richardson /**
17199a2dd95SBruce Richardson  * Enable recording events of the given tracepoint in the trace buffer.
17299a2dd95SBruce Richardson  *
17399a2dd95SBruce Richardson  * @param tp
17499a2dd95SBruce Richardson  *   The tracepoint object to enable.
17599a2dd95SBruce Richardson  * @return
17699a2dd95SBruce Richardson  *   - 0: Success.
17799a2dd95SBruce Richardson  *   - (-ERANGE): Trace object is not registered.
17899a2dd95SBruce Richardson  */
17999a2dd95SBruce Richardson __rte_experimental
18099a2dd95SBruce Richardson int rte_trace_point_enable(rte_trace_point_t *tp);
18199a2dd95SBruce Richardson 
18299a2dd95SBruce Richardson /**
18399a2dd95SBruce Richardson  * Disable recording events of the given tracepoint in the trace buffer.
18499a2dd95SBruce Richardson  *
18599a2dd95SBruce Richardson  * @param tp
18699a2dd95SBruce Richardson  *   The tracepoint object to disable.
18799a2dd95SBruce Richardson  * @return
18899a2dd95SBruce Richardson  *   - 0: Success.
18999a2dd95SBruce Richardson  *   - (-ERANGE): Trace object is not registered.
19099a2dd95SBruce Richardson  */
19199a2dd95SBruce Richardson __rte_experimental
19299a2dd95SBruce Richardson int rte_trace_point_disable(rte_trace_point_t *tp);
19399a2dd95SBruce Richardson 
19499a2dd95SBruce Richardson /**
19599a2dd95SBruce Richardson  * Test if recording events from the given tracepoint is enabled.
19699a2dd95SBruce Richardson  *
19799a2dd95SBruce Richardson  * @param tp
19899a2dd95SBruce Richardson  *    The tracepoint object.
19999a2dd95SBruce Richardson  * @return
20099a2dd95SBruce Richardson  *    true if tracepoint is enabled, false otherwise.
20199a2dd95SBruce Richardson  */
20299a2dd95SBruce Richardson __rte_experimental
20399a2dd95SBruce Richardson bool rte_trace_point_is_enabled(rte_trace_point_t *tp);
20499a2dd95SBruce Richardson 
20599a2dd95SBruce Richardson /**
20699a2dd95SBruce Richardson  * Lookup a tracepoint object from its name.
20799a2dd95SBruce Richardson  *
20899a2dd95SBruce Richardson  * @param name
20999a2dd95SBruce Richardson  *   The name of the tracepoint.
21099a2dd95SBruce Richardson  * @return
21199a2dd95SBruce Richardson  *   The tracepoint object or NULL if not found.
21299a2dd95SBruce Richardson  */
21399a2dd95SBruce Richardson __rte_experimental
21499a2dd95SBruce Richardson rte_trace_point_t *rte_trace_point_lookup(const char *name);
21599a2dd95SBruce Richardson 
21699a2dd95SBruce Richardson /**
21799a2dd95SBruce Richardson  * @internal
21899a2dd95SBruce Richardson  *
21999a2dd95SBruce Richardson  * Test if the tracepoint fast path compile-time option is enabled.
22099a2dd95SBruce Richardson  *
22199a2dd95SBruce Richardson  * @return
22299a2dd95SBruce Richardson  *   true if tracepoint fast path enabled, false otherwise.
22399a2dd95SBruce Richardson  */
22499a2dd95SBruce Richardson __rte_experimental
22599a2dd95SBruce Richardson static __rte_always_inline bool
22699a2dd95SBruce Richardson __rte_trace_point_fp_is_enabled(void)
22799a2dd95SBruce Richardson {
22899a2dd95SBruce Richardson #ifdef RTE_ENABLE_TRACE_FP
22999a2dd95SBruce Richardson 	return true;
23099a2dd95SBruce Richardson #else
23199a2dd95SBruce Richardson 	return false;
23299a2dd95SBruce Richardson #endif
23399a2dd95SBruce Richardson }
23499a2dd95SBruce Richardson 
23599a2dd95SBruce Richardson /**
23699a2dd95SBruce Richardson  * @internal
23799a2dd95SBruce Richardson  *
23899a2dd95SBruce Richardson  * Allocate trace memory buffer per thread.
23999a2dd95SBruce Richardson  */
24099a2dd95SBruce Richardson __rte_experimental
24199a2dd95SBruce Richardson void __rte_trace_mem_per_thread_alloc(void);
24299a2dd95SBruce Richardson 
24399a2dd95SBruce Richardson /**
24499a2dd95SBruce Richardson  * @internal
24599a2dd95SBruce Richardson  *
24699a2dd95SBruce Richardson  * Helper function to emit field.
24799a2dd95SBruce Richardson  *
24899a2dd95SBruce Richardson  * @param sz
24999a2dd95SBruce Richardson  *   The tracepoint size.
25099a2dd95SBruce Richardson  * @param field
25199a2dd95SBruce Richardson  *   The name of the trace event.
25299a2dd95SBruce Richardson  * @param type
25399a2dd95SBruce Richardson  *   The datatype of the trace event as string.
25499a2dd95SBruce Richardson  * @return
25599a2dd95SBruce Richardson  *   - 0: Success.
25699a2dd95SBruce Richardson  *   - <0: Failure.
25799a2dd95SBruce Richardson  */
25899a2dd95SBruce Richardson __rte_experimental
25999a2dd95SBruce Richardson void __rte_trace_point_emit_field(size_t sz, const char *field,
26099a2dd95SBruce Richardson 	const char *type);
26199a2dd95SBruce Richardson 
26299a2dd95SBruce Richardson /**
26399a2dd95SBruce Richardson  * @internal
26499a2dd95SBruce Richardson  *
26599a2dd95SBruce Richardson  * Helper function to register a dynamic tracepoint.
26699a2dd95SBruce Richardson  * Use RTE_TRACE_POINT_REGISTER macro for tracepoint registration.
26799a2dd95SBruce Richardson  *
26899a2dd95SBruce Richardson  * @param trace
26999a2dd95SBruce Richardson  *   The tracepoint object created using RTE_TRACE_POINT_REGISTER.
27099a2dd95SBruce Richardson  * @param name
27199a2dd95SBruce Richardson  *   The name of the tracepoint object.
27299a2dd95SBruce Richardson  * @param register_fn
27399a2dd95SBruce Richardson  *   Trace registration function.
27499a2dd95SBruce Richardson  * @return
27599a2dd95SBruce Richardson  *   - 0: Successfully registered the tracepoint.
27699a2dd95SBruce Richardson  *   - <0: Failure to register the tracepoint.
27799a2dd95SBruce Richardson  */
27899a2dd95SBruce Richardson __rte_experimental
27999a2dd95SBruce Richardson int __rte_trace_point_register(rte_trace_point_t *trace, const char *name,
28099a2dd95SBruce Richardson 	void (*register_fn)(void));
28199a2dd95SBruce Richardson 
28299a2dd95SBruce Richardson #ifndef __DOXYGEN__
28399a2dd95SBruce Richardson 
28499a2dd95SBruce Richardson #ifndef _RTE_TRACE_POINT_REGISTER_H_
28599a2dd95SBruce Richardson #ifdef ALLOW_EXPERIMENTAL_API
28699a2dd95SBruce Richardson 
28799a2dd95SBruce Richardson #define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48)
28899a2dd95SBruce Richardson 
28999a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_SIZE_SHIFT 0
29099a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_SIZE_MASK (0xffffULL << __RTE_TRACE_FIELD_SIZE_SHIFT)
29199a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_ID_SHIFT (16)
29299a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_ID_MASK (0xffffULL << __RTE_TRACE_FIELD_ID_SHIFT)
29399a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_ENABLE_MASK (1ULL << 63)
29499a2dd95SBruce Richardson #define __RTE_TRACE_FIELD_ENABLE_DISCARD (1ULL << 62)
29599a2dd95SBruce Richardson 
29699a2dd95SBruce Richardson struct __rte_trace_stream_header {
29799a2dd95SBruce Richardson 	uint32_t magic;
29899a2dd95SBruce Richardson 	rte_uuid_t uuid;
29999a2dd95SBruce Richardson 	uint32_t lcore_id;
30099a2dd95SBruce Richardson 	char thread_name[__RTE_TRACE_EMIT_STRING_LEN_MAX];
301*5dc68f2bSAndre Muezerie };
30299a2dd95SBruce Richardson 
30399a2dd95SBruce Richardson struct __rte_trace_header {
30499a2dd95SBruce Richardson 	uint32_t offset;
30599a2dd95SBruce Richardson 	uint32_t len;
30699a2dd95SBruce Richardson 	struct __rte_trace_stream_header stream_header;
30799a2dd95SBruce Richardson 	uint8_t mem[];
30899a2dd95SBruce Richardson };
30999a2dd95SBruce Richardson 
31099a2dd95SBruce Richardson RTE_DECLARE_PER_LCORE(void *, trace_mem);
31199a2dd95SBruce Richardson 
31299a2dd95SBruce Richardson static __rte_always_inline void *
31399a2dd95SBruce Richardson __rte_trace_mem_get(uint64_t in)
31499a2dd95SBruce Richardson {
31599a2dd95SBruce Richardson 	struct __rte_trace_header *trace =
31699a2dd95SBruce Richardson 		(struct __rte_trace_header *)(RTE_PER_LCORE(trace_mem));
31799a2dd95SBruce Richardson 	const uint16_t sz = in & __RTE_TRACE_FIELD_SIZE_MASK;
31899a2dd95SBruce Richardson 
31999a2dd95SBruce Richardson 	/* Trace memory is not initialized for this thread */
32099a2dd95SBruce Richardson 	if (unlikely(trace == NULL)) {
32199a2dd95SBruce Richardson 		__rte_trace_mem_per_thread_alloc();
32299a2dd95SBruce Richardson 		trace = (struct __rte_trace_header *)(RTE_PER_LCORE(trace_mem));
32399a2dd95SBruce Richardson 		if (unlikely(trace == NULL))
32499a2dd95SBruce Richardson 			return NULL;
32599a2dd95SBruce Richardson 	}
32699a2dd95SBruce Richardson 	/* Check the wrap around case */
32799a2dd95SBruce Richardson 	uint32_t offset = trace->offset;
32899a2dd95SBruce Richardson 	if (unlikely((offset + sz) >= trace->len)) {
32999a2dd95SBruce Richardson 		/* Disable the trace event if it in DISCARD mode */
33099a2dd95SBruce Richardson 		if (unlikely(in & __RTE_TRACE_FIELD_ENABLE_DISCARD))
33199a2dd95SBruce Richardson 			return NULL;
33299a2dd95SBruce Richardson 
33399a2dd95SBruce Richardson 		offset = 0;
33499a2dd95SBruce Richardson 	}
33599a2dd95SBruce Richardson 	/* Align to event header size */
33699a2dd95SBruce Richardson 	offset = RTE_ALIGN_CEIL(offset, __RTE_TRACE_EVENT_HEADER_SZ);
33799a2dd95SBruce Richardson 	void *mem = RTE_PTR_ADD(&trace->mem[0], offset);
33899a2dd95SBruce Richardson 	offset += sz;
33999a2dd95SBruce Richardson 	trace->offset = offset;
34099a2dd95SBruce Richardson 
34199a2dd95SBruce Richardson 	return mem;
34299a2dd95SBruce Richardson }
34399a2dd95SBruce Richardson 
34499a2dd95SBruce Richardson static __rte_always_inline void *
34599a2dd95SBruce Richardson __rte_trace_point_emit_ev_header(void *mem, uint64_t in)
34699a2dd95SBruce Richardson {
34799a2dd95SBruce Richardson 	uint64_t val;
34899a2dd95SBruce Richardson 
34999a2dd95SBruce Richardson 	/* Event header [63:0] = id [63:48] | timestamp [47:0] */
35099a2dd95SBruce Richardson 	val = rte_get_tsc_cycles() &
35199a2dd95SBruce Richardson 		~(0xffffULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT);
35299a2dd95SBruce Richardson 	val |= ((in & __RTE_TRACE_FIELD_ID_MASK) <<
35399a2dd95SBruce Richardson 		(__RTE_TRACE_EVENT_HEADER_ID_SHIFT -
35499a2dd95SBruce Richardson 		 __RTE_TRACE_FIELD_ID_SHIFT));
35599a2dd95SBruce Richardson 
35699a2dd95SBruce Richardson 	*(uint64_t *)mem = val;
35799a2dd95SBruce Richardson 	return RTE_PTR_ADD(mem, __RTE_TRACE_EVENT_HEADER_SZ);
35899a2dd95SBruce Richardson }
35999a2dd95SBruce Richardson 
36099a2dd95SBruce Richardson #define __rte_trace_point_emit_header_generic(t) \
36199a2dd95SBruce Richardson void *mem; \
36299a2dd95SBruce Richardson do { \
363e7bc451cSMorten Brørup 	if (!rte_trace_feature_is_enabled()) \
364e7bc451cSMorten Brørup 		return; \
3651ec6a845STyler Retzlaff 	const uint64_t val = rte_atomic_load_explicit(t, rte_memory_order_acquire); \
36699a2dd95SBruce Richardson 	if (likely(!(val & __RTE_TRACE_FIELD_ENABLE_MASK))) \
36799a2dd95SBruce Richardson 		return; \
36899a2dd95SBruce Richardson 	mem = __rte_trace_mem_get(val); \
36999a2dd95SBruce Richardson 	if (unlikely(mem == NULL)) \
37099a2dd95SBruce Richardson 		return; \
37199a2dd95SBruce Richardson 	mem = __rte_trace_point_emit_ev_header(mem, val); \
37299a2dd95SBruce Richardson } while (0)
37399a2dd95SBruce Richardson 
37499a2dd95SBruce Richardson #define __rte_trace_point_emit_header_fp(t) \
37599a2dd95SBruce Richardson 	if (!__rte_trace_point_fp_is_enabled()) \
37699a2dd95SBruce Richardson 		return; \
37799a2dd95SBruce Richardson 	__rte_trace_point_emit_header_generic(t)
37899a2dd95SBruce Richardson 
37999a2dd95SBruce Richardson #define __rte_trace_point_emit(in, type) \
38099a2dd95SBruce Richardson do { \
38199a2dd95SBruce Richardson 	memcpy(mem, &(in), sizeof(in)); \
38299a2dd95SBruce Richardson 	mem = RTE_PTR_ADD(mem, sizeof(in)); \
38399a2dd95SBruce Richardson } while (0)
38499a2dd95SBruce Richardson 
38599a2dd95SBruce Richardson #define rte_trace_point_emit_string(in) \
38699a2dd95SBruce Richardson do { \
38799a2dd95SBruce Richardson 	if (unlikely(in == NULL)) \
38899a2dd95SBruce Richardson 		return; \
38959144f6eSBruce Richardson 	rte_strscpy((char *)mem, in, __RTE_TRACE_EMIT_STRING_LEN_MAX); \
39099a2dd95SBruce Richardson 	mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX); \
39199a2dd95SBruce Richardson } while (0)
39299a2dd95SBruce Richardson 
3934925e15aSAnkur Dwivedi #define rte_trace_point_emit_blob(in, len) \
3944925e15aSAnkur Dwivedi do { \
3954925e15aSAnkur Dwivedi 	if (unlikely(in == NULL)) \
3964925e15aSAnkur Dwivedi 		return; \
3974925e15aSAnkur Dwivedi 	if (len > RTE_TRACE_BLOB_LEN_MAX) \
3984925e15aSAnkur Dwivedi 		len = RTE_TRACE_BLOB_LEN_MAX; \
3994925e15aSAnkur Dwivedi 	__rte_trace_point_emit(len, uint8_t); \
4004925e15aSAnkur Dwivedi 	memcpy(mem, in, len); \
4014925e15aSAnkur Dwivedi 	memset(RTE_PTR_ADD(mem, len), 0, RTE_TRACE_BLOB_LEN_MAX - len); \
4024925e15aSAnkur Dwivedi 	mem = RTE_PTR_ADD(mem, RTE_TRACE_BLOB_LEN_MAX); \
4034925e15aSAnkur Dwivedi } while (0)
4044925e15aSAnkur Dwivedi 
40599a2dd95SBruce Richardson #else
40699a2dd95SBruce Richardson 
40799a2dd95SBruce Richardson #define __rte_trace_point_emit_header_generic(t) RTE_SET_USED(t)
40899a2dd95SBruce Richardson #define __rte_trace_point_emit_header_fp(t) RTE_SET_USED(t)
40999a2dd95SBruce Richardson #define __rte_trace_point_emit(in, type) RTE_SET_USED(in)
41099a2dd95SBruce Richardson #define rte_trace_point_emit_string(in) RTE_SET_USED(in)
4114925e15aSAnkur Dwivedi #define rte_trace_point_emit_blob(in, len) \
4124925e15aSAnkur Dwivedi do { \
4134925e15aSAnkur Dwivedi 	RTE_SET_USED(in); \
4144925e15aSAnkur Dwivedi 	RTE_SET_USED(len); \
4154925e15aSAnkur Dwivedi } while (0)
4164925e15aSAnkur Dwivedi 
41799a2dd95SBruce Richardson 
41899a2dd95SBruce Richardson #endif /* ALLOW_EXPERIMENTAL_API */
41999a2dd95SBruce Richardson #endif /* _RTE_TRACE_POINT_REGISTER_H_ */
42099a2dd95SBruce Richardson 
42199a2dd95SBruce Richardson #define rte_trace_point_emit_u64(in) __rte_trace_point_emit(in, uint64_t)
42299a2dd95SBruce Richardson #define rte_trace_point_emit_i64(in) __rte_trace_point_emit(in, int64_t)
42399a2dd95SBruce Richardson #define rte_trace_point_emit_u32(in) __rte_trace_point_emit(in, uint32_t)
42499a2dd95SBruce Richardson #define rte_trace_point_emit_i32(in) __rte_trace_point_emit(in, int32_t)
42599a2dd95SBruce Richardson #define rte_trace_point_emit_u16(in) __rte_trace_point_emit(in, uint16_t)
42699a2dd95SBruce Richardson #define rte_trace_point_emit_i16(in) __rte_trace_point_emit(in, int16_t)
42799a2dd95SBruce Richardson #define rte_trace_point_emit_u8(in) __rte_trace_point_emit(in, uint8_t)
42899a2dd95SBruce Richardson #define rte_trace_point_emit_i8(in) __rte_trace_point_emit(in, int8_t)
42999a2dd95SBruce Richardson #define rte_trace_point_emit_int(in) __rte_trace_point_emit(in, int32_t)
43099a2dd95SBruce Richardson #define rte_trace_point_emit_long(in) __rte_trace_point_emit(in, long)
43199a2dd95SBruce Richardson #define rte_trace_point_emit_size_t(in) __rte_trace_point_emit(in, size_t)
43299a2dd95SBruce Richardson #define rte_trace_point_emit_float(in) __rte_trace_point_emit(in, float)
43399a2dd95SBruce Richardson #define rte_trace_point_emit_double(in) __rte_trace_point_emit(in, double)
43499a2dd95SBruce Richardson #define rte_trace_point_emit_ptr(in) __rte_trace_point_emit(in, uintptr_t)
43599a2dd95SBruce Richardson 
43699a2dd95SBruce Richardson #endif /* __DOXYGEN__ */
43799a2dd95SBruce Richardson 
43899a2dd95SBruce Richardson #ifdef __cplusplus
43999a2dd95SBruce Richardson }
44099a2dd95SBruce Richardson #endif
44199a2dd95SBruce Richardson 
44299a2dd95SBruce Richardson #endif /* _RTE_TRACE_POINT_H_ */
443