Adds a trace point emit function for array. The maximum array bytes which can be captured is set to 32.
Also adds test case for emit array tracepoint function. Signed-off-by: Ankur Dwivedi <adwiv...@marvell.com> --- app/test/test_trace.c | 3 +++ lib/eal/common/eal_common_trace_points.c | 2 ++ lib/eal/include/rte_eal_trace.h | 6 ++++++ lib/eal/include/rte_trace_point.h | 20 ++++++++++++++++++++ lib/eal/include/rte_trace_point_register.h | 8 ++++++++ 5 files changed, 39 insertions(+) diff --git a/app/test/test_trace.c b/app/test/test_trace.c index 6bedf14024..99cd0762d1 100644 --- a/app/test/test_trace.c +++ b/app/test/test_trace.c @@ -177,6 +177,7 @@ test_fp_trace_points(void) static int test_generic_trace_points(void) { + uint8_t arr[32] = {0}; int tmp; rte_eal_trace_generic_void(); @@ -195,6 +196,8 @@ test_generic_trace_points(void) rte_eal_trace_generic_ptr(&tmp); rte_eal_trace_generic_str("my string"); rte_eal_trace_generic_size_t(sizeof(void *)); + rte_eal_trace_generic_char_array(arr, 32); + rte_eal_trace_generic_char_array(arr, 64); RTE_EAL_TRACE_GENERIC_FUNC; return TEST_SUCCESS; diff --git a/lib/eal/common/eal_common_trace_points.c b/lib/eal/common/eal_common_trace_points.c index 0b0b254615..93fdaa634e 100644 --- a/lib/eal/common/eal_common_trace_points.c +++ b/lib/eal/common/eal_common_trace_points.c @@ -40,6 +40,8 @@ RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_size_t, lib.eal.generic.size_t) RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_func, lib.eal.generic.func) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_char_array, + lib.eal.generic.char.array) RTE_TRACE_POINT_REGISTER(rte_eal_trace_alarm_set, lib.eal.alarm.set) diff --git a/lib/eal/include/rte_eal_trace.h b/lib/eal/include/rte_eal_trace.h index 5ef4398230..34fdd5331f 100644 --- a/lib/eal/include/rte_eal_trace.h +++ b/lib/eal/include/rte_eal_trace.h @@ -143,6 +143,12 @@ RTE_TRACE_POINT( rte_trace_point_emit_string(func); ) +RTE_TRACE_POINT( + rte_eal_trace_generic_char_array, + RTE_TRACE_POINT_ARGS(void *in, uint8_t len), + rte_trace_point_emit_char_array(in, len); +) + #define RTE_EAL_TRACE_GENERIC_FUNC rte_eal_trace_generic_func(__func__) /* Interrupt */ diff --git a/lib/eal/include/rte_trace_point.h b/lib/eal/include/rte_trace_point.h index 0f8700974f..9d9a9e0aaa 100644 --- a/lib/eal/include/rte_trace_point.h +++ b/lib/eal/include/rte_trace_point.h @@ -144,6 +144,8 @@ _tp _args \ #define rte_trace_point_emit_ptr(val) /** Tracepoint function payload for string datatype */ #define rte_trace_point_emit_string(val) +/** Tracepoint function payload for char array */ +#define rte_trace_point_emit_char_array(val, len) #endif /* __DOXYGEN__ */ @@ -151,6 +153,8 @@ _tp _args \ #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32 /** @internal Macro to define event header size. */ #define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t) +/** @internal Macro to define maximum emit length of array. */ +#define __RTE_TRACE_EMIT_ARRAY_LEN_MAX 32 /** * Enable recording events of the given tracepoint in the trace buffer. @@ -374,12 +378,28 @@ do { \ mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX); \ } while (0) +#define rte_trace_point_emit_char_array(in, len) \ +do { \ + if (unlikely(in == NULL)) \ + return; \ + if (len > __RTE_TRACE_EMIT_ARRAY_LEN_MAX) \ + return; \ + memcpy(mem, in, len); \ + mem = RTE_PTR_ADD(mem, len); \ +} while (0) + #else #define __rte_trace_point_emit_header_generic(t) RTE_SET_USED(t) #define __rte_trace_point_emit_header_fp(t) RTE_SET_USED(t) #define __rte_trace_point_emit(in, type) RTE_SET_USED(in) #define rte_trace_point_emit_string(in) RTE_SET_USED(in) +#define rte_trace_point_emit_char_array(in, len) \ +do { \ + RTE_SET_USED(in); \ + RTE_SET_USED(len); \ +} while (0) + #endif /* ALLOW_EXPERIMENTAL_API */ #endif /* _RTE_TRACE_POINT_REGISTER_H_ */ diff --git a/lib/eal/include/rte_trace_point_register.h b/lib/eal/include/rte_trace_point_register.h index a32f4d731b..c76fe4dd48 100644 --- a/lib/eal/include/rte_trace_point_register.h +++ b/lib/eal/include/rte_trace_point_register.h @@ -47,6 +47,14 @@ do { \ RTE_STR(in)"[32]", "string_bounded_t"); \ } while (0) +#define rte_trace_point_emit_char_array(in, len) \ +do { \ + RTE_SET_USED(in); \ + if (len > __RTE_TRACE_EMIT_ARRAY_LEN_MAX) \ + return; \ + __rte_trace_point_emit_field(len, RTE_STR(in)"[32]", "uint8_t"); \ +} while (0) + #ifdef __cplusplus } #endif -- 2.25.1