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