xref: /dpdk/lib/eal/common/eal_common_trace_ctf.c (revision 2a7a42a5918af42dbf229d30dbba13697e68320f)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(C) 2020 Marvell International Ltd.
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <inttypes.h>
672b452c5SDmitry Kozlyuk #include <stdlib.h>
799a2dd95SBruce Richardson #include <time.h>
899a2dd95SBruce Richardson 
999a2dd95SBruce Richardson #include <rte_byteorder.h>
1099a2dd95SBruce Richardson #include <rte_common.h>
1199a2dd95SBruce Richardson #include <rte_time.h>
1299a2dd95SBruce Richardson #include <rte_trace.h>
1399a2dd95SBruce Richardson #include <rte_version.h>
1499a2dd95SBruce Richardson 
1599a2dd95SBruce Richardson #include "eal_trace.h"
1699a2dd95SBruce Richardson 
1799a2dd95SBruce Richardson __rte_format_printf(2, 0)
1899a2dd95SBruce Richardson static int
metadata_printf(char ** str,const char * fmt,...)1999a2dd95SBruce Richardson metadata_printf(char **str, const char *fmt, ...)
2099a2dd95SBruce Richardson {
2199a2dd95SBruce Richardson 	va_list ap;
2299a2dd95SBruce Richardson 	int rc;
2399a2dd95SBruce Richardson 
2499a2dd95SBruce Richardson 	*str = NULL;
2599a2dd95SBruce Richardson 	va_start(ap, fmt);
2699a2dd95SBruce Richardson 	rc = vasprintf(str, fmt, ap);
2799a2dd95SBruce Richardson 	va_end(ap);
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson 	return rc;
3099a2dd95SBruce Richardson }
3199a2dd95SBruce Richardson 
3299a2dd95SBruce Richardson static int
meta_copy(char ** meta,int * offset,char * str,int rc)3399a2dd95SBruce Richardson meta_copy(char **meta, int *offset, char *str, int rc)
3499a2dd95SBruce Richardson {
3599a2dd95SBruce Richardson 	int count = *offset;
3699a2dd95SBruce Richardson 	char *ptr = *meta;
3799a2dd95SBruce Richardson 
3899a2dd95SBruce Richardson 	if (rc < 0)
3999a2dd95SBruce Richardson 		return rc;
4099a2dd95SBruce Richardson 
4199a2dd95SBruce Richardson 	ptr = realloc(ptr, count + rc + 1);
4299a2dd95SBruce Richardson 	if (ptr == NULL)
4399a2dd95SBruce Richardson 		goto free_str;
4499a2dd95SBruce Richardson 
4599a2dd95SBruce Richardson 	memcpy(RTE_PTR_ADD(ptr, count), str, rc);
4699a2dd95SBruce Richardson 	ptr[count + rc] = '\0';
4799a2dd95SBruce Richardson 	count += rc;
4899a2dd95SBruce Richardson 	free(str);
4999a2dd95SBruce Richardson 
5099a2dd95SBruce Richardson 	*meta = ptr;
5199a2dd95SBruce Richardson 	*offset = count;
5299a2dd95SBruce Richardson 
5399a2dd95SBruce Richardson 	return rc;
5499a2dd95SBruce Richardson 
5599a2dd95SBruce Richardson free_str:
5699a2dd95SBruce Richardson 	free(str);
5799a2dd95SBruce Richardson 	return -ENOMEM;
5899a2dd95SBruce Richardson }
5999a2dd95SBruce Richardson 
6099a2dd95SBruce Richardson static int
meta_data_type_emit(char ** meta,int * offset)6199a2dd95SBruce Richardson meta_data_type_emit(char **meta, int *offset)
6299a2dd95SBruce Richardson {
6399a2dd95SBruce Richardson 	char *str = NULL;
6499a2dd95SBruce Richardson 	int rc;
6599a2dd95SBruce Richardson 
6699a2dd95SBruce Richardson 	rc = metadata_printf(&str,
6799a2dd95SBruce Richardson 		"/* CTF 1.8 */\n"
6899a2dd95SBruce Richardson 		"typealias integer {size = 8; base = x;}:= uint8_t;\n"
6999a2dd95SBruce Richardson 		"typealias integer {size = 16; base = x;} := uint16_t;\n"
7099a2dd95SBruce Richardson 		"typealias integer {size = 32; base = x;} := uint32_t;\n"
7199a2dd95SBruce Richardson 		"typealias integer {size = 64; base = x;} := uint64_t;\n"
7299a2dd95SBruce Richardson 		"typealias integer {size = 8; signed = true;}  := int8_t;\n"
7399a2dd95SBruce Richardson 		"typealias integer {size = 16; signed = true;} := int16_t;\n"
7499a2dd95SBruce Richardson 		"typealias integer {size = 32; signed = true;} := int32_t;\n"
7599a2dd95SBruce Richardson 		"typealias integer {size = 64; signed = true;} := int64_t;\n"
7699a2dd95SBruce Richardson #ifdef RTE_ARCH_64
7799a2dd95SBruce Richardson 		"typealias integer {size = 64; base = x;} := uintptr_t;\n"
7899a2dd95SBruce Richardson #else
7999a2dd95SBruce Richardson 		"typealias integer {size = 32; base = x;} := uintptr_t;\n"
8099a2dd95SBruce Richardson #endif
8199a2dd95SBruce Richardson #ifdef RTE_ARCH_64
8299a2dd95SBruce Richardson 		"typealias integer {size = 64; base = x;} := long;\n"
8399a2dd95SBruce Richardson #else
8499a2dd95SBruce Richardson 		"typealias integer {size = 32; base = x;} := long;\n"
8599a2dd95SBruce Richardson #endif
8699a2dd95SBruce Richardson 		"typealias integer {size = 8; signed = false; encoding = ASCII; } := string_bounded_t;\n\n"
8799a2dd95SBruce Richardson #ifdef RTE_ARCH_64
8899a2dd95SBruce Richardson 		"typealias integer {size = 64; base = x;} := size_t;\n"
8999a2dd95SBruce Richardson #else
9099a2dd95SBruce Richardson 		"typealias integer {size = 32; base = x;} := size_t;\n"
9199a2dd95SBruce Richardson #endif
9299a2dd95SBruce Richardson 		"typealias floating_point {\n"
9399a2dd95SBruce Richardson 		"    exp_dig = 8;\n"
9499a2dd95SBruce Richardson 		"    mant_dig = 24;\n"
9599a2dd95SBruce Richardson 		"} := float;\n\n"
9699a2dd95SBruce Richardson 		"typealias floating_point {\n"
9799a2dd95SBruce Richardson 		"    exp_dig = 11;\n"
9899a2dd95SBruce Richardson 		"    mant_dig = 53;\n"
9999a2dd95SBruce Richardson 		"} := double;\n\n");
10099a2dd95SBruce Richardson 
10199a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
10299a2dd95SBruce Richardson }
10399a2dd95SBruce Richardson 
10499a2dd95SBruce Richardson static int
is_be(void)10599a2dd95SBruce Richardson is_be(void)
10699a2dd95SBruce Richardson {
10799a2dd95SBruce Richardson #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
10899a2dd95SBruce Richardson 	return 1;
10999a2dd95SBruce Richardson #else
11099a2dd95SBruce Richardson 	return 0;
11199a2dd95SBruce Richardson #endif
11299a2dd95SBruce Richardson }
11399a2dd95SBruce Richardson 
11499a2dd95SBruce Richardson static int
meta_header_emit(char ** meta,int * offset)11599a2dd95SBruce Richardson meta_header_emit(char **meta, int *offset)
11699a2dd95SBruce Richardson {
11799a2dd95SBruce Richardson 	struct trace *trace = trace_obj_get();
11899a2dd95SBruce Richardson 	char uustr[RTE_UUID_STRLEN];
11999a2dd95SBruce Richardson 	char *str = NULL;
12099a2dd95SBruce Richardson 	int rc;
12199a2dd95SBruce Richardson 
12299a2dd95SBruce Richardson 	rte_uuid_unparse(trace->uuid, uustr, RTE_UUID_STRLEN);
12399a2dd95SBruce Richardson 	rc = metadata_printf(&str,
12499a2dd95SBruce Richardson 		"trace {\n"
12599a2dd95SBruce Richardson 		"    major = 1;\n"
12699a2dd95SBruce Richardson 		"    minor = 8;\n"
12799a2dd95SBruce Richardson 		"    uuid = \"%s\";\n"
12899a2dd95SBruce Richardson 		"    byte_order = %s;\n"
12999a2dd95SBruce Richardson 		"    packet.header := struct {\n"
13099a2dd95SBruce Richardson 		"	    uint32_t magic;\n"
13199a2dd95SBruce Richardson 		"	    uint8_t  uuid[16];\n"
13299a2dd95SBruce Richardson 		"    };\n"
13399a2dd95SBruce Richardson 		"};\n\n", uustr, is_be() ? "be" : "le");
13499a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
13599a2dd95SBruce Richardson }
13699a2dd95SBruce Richardson 
13799a2dd95SBruce Richardson static int
meta_env_emit(char ** meta,int * offset)13899a2dd95SBruce Richardson meta_env_emit(char **meta, int *offset)
13999a2dd95SBruce Richardson {
14099a2dd95SBruce Richardson 	char *str = NULL;
14199a2dd95SBruce Richardson 	int rc;
14299a2dd95SBruce Richardson 
14399a2dd95SBruce Richardson 	rc = metadata_printf(&str,
14499a2dd95SBruce Richardson 		"env {\n"
14599a2dd95SBruce Richardson 		"    dpdk_version = \"%s\";\n"
14699a2dd95SBruce Richardson 		"    tracer_name = \"dpdk\";\n"
14799a2dd95SBruce Richardson 		"};\n\n", rte_version());
14899a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
14999a2dd95SBruce Richardson }
15099a2dd95SBruce Richardson 
15199a2dd95SBruce Richardson static int
meta_clock_pass1_emit(char ** meta,int * offset)15299a2dd95SBruce Richardson meta_clock_pass1_emit(char **meta, int *offset)
15399a2dd95SBruce Richardson {
15499a2dd95SBruce Richardson 	char *str = NULL;
15599a2dd95SBruce Richardson 	int rc;
15699a2dd95SBruce Richardson 
15799a2dd95SBruce Richardson 	rc = metadata_printf(&str,
15899a2dd95SBruce Richardson 		"clock {\n"
15999a2dd95SBruce Richardson 		"    name = \"dpdk\";\n"
16099a2dd95SBruce Richardson 		"    freq = ");
16199a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
16299a2dd95SBruce Richardson }
16399a2dd95SBruce Richardson 
16499a2dd95SBruce Richardson static int
meta_clock_pass2_emit(char ** meta,int * offset)16599a2dd95SBruce Richardson meta_clock_pass2_emit(char **meta, int *offset)
16699a2dd95SBruce Richardson {
16799a2dd95SBruce Richardson 	char *str = NULL;
16899a2dd95SBruce Richardson 	int rc;
16999a2dd95SBruce Richardson 
17099a2dd95SBruce Richardson 	rc = metadata_printf(&str,
17199a2dd95SBruce Richardson 		"%20"PRIu64";\n"
17299a2dd95SBruce Richardson 		"    offset_s =", 0);
17399a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
17499a2dd95SBruce Richardson }
17599a2dd95SBruce Richardson 
17699a2dd95SBruce Richardson static int
meta_clock_pass3_emit(char ** meta,int * offset)17799a2dd95SBruce Richardson meta_clock_pass3_emit(char **meta, int *offset)
17899a2dd95SBruce Richardson {
17999a2dd95SBruce Richardson 	char *str = NULL;
18099a2dd95SBruce Richardson 	int rc;
18199a2dd95SBruce Richardson 
18299a2dd95SBruce Richardson 	rc = metadata_printf(&str,
18399a2dd95SBruce Richardson 		"%20"PRIu64";\n"
18499a2dd95SBruce Richardson 		"    offset =", 0);
18599a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
18699a2dd95SBruce Richardson }
18799a2dd95SBruce Richardson 
18899a2dd95SBruce Richardson static int
meta_clock_pass4_emit(char ** meta,int * offset)18999a2dd95SBruce Richardson meta_clock_pass4_emit(char **meta, int *offset)
19099a2dd95SBruce Richardson {
19199a2dd95SBruce Richardson 	char *str = NULL;
19299a2dd95SBruce Richardson 	int rc;
19399a2dd95SBruce Richardson 
19499a2dd95SBruce Richardson 	rc = metadata_printf(&str,
19599a2dd95SBruce Richardson 		"%20"PRIu64";\n};\n\n"
19699a2dd95SBruce Richardson 		"typealias integer {\n"
19799a2dd95SBruce Richardson 		"    size = 48; align = 1; signed = false;\n"
19899a2dd95SBruce Richardson 		"    map = clock.dpdk.value;\n"
19999a2dd95SBruce Richardson 		"} := uint48_clock_dpdk_t;\n\n", 0);
20099a2dd95SBruce Richardson 
20199a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
20299a2dd95SBruce Richardson }
20399a2dd95SBruce Richardson 
20499a2dd95SBruce Richardson static int
meta_stream_emit(char ** meta,int * offset)20599a2dd95SBruce Richardson meta_stream_emit(char **meta, int *offset)
20699a2dd95SBruce Richardson {
20799a2dd95SBruce Richardson 	char *str = NULL;
20899a2dd95SBruce Richardson 	int rc;
20999a2dd95SBruce Richardson 
21099a2dd95SBruce Richardson 	rc = metadata_printf(&str,
21199a2dd95SBruce Richardson 		"stream {\n"
21299a2dd95SBruce Richardson 		"    packet.context := struct {\n"
21399a2dd95SBruce Richardson 		"         uint32_t cpu_id;\n"
21499a2dd95SBruce Richardson 		"         string_bounded_t name[32];\n"
21599a2dd95SBruce Richardson 		"    };\n"
21699a2dd95SBruce Richardson 		"    event.header := struct {\n"
21799a2dd95SBruce Richardson 		"          uint48_clock_dpdk_t timestamp;\n"
21899a2dd95SBruce Richardson 		"          uint16_t id;\n"
21999a2dd95SBruce Richardson 		"    } align(64);\n"
22099a2dd95SBruce Richardson 		"};\n\n");
22199a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
22299a2dd95SBruce Richardson }
22399a2dd95SBruce Richardson 
22499a2dd95SBruce Richardson static int
meta_event_emit(char ** meta,int * offset,struct trace_point * tp)22599a2dd95SBruce Richardson meta_event_emit(char **meta, int *offset, struct trace_point *tp)
22699a2dd95SBruce Richardson {
22799a2dd95SBruce Richardson 	char *str = NULL;
22899a2dd95SBruce Richardson 	int rc;
22999a2dd95SBruce Richardson 
23099a2dd95SBruce Richardson 	rc = metadata_printf(&str,
23199a2dd95SBruce Richardson 		"event {\n"
23299a2dd95SBruce Richardson 		"    id = %d;\n"
23399a2dd95SBruce Richardson 		"    name = \"%s\";\n"
23499a2dd95SBruce Richardson 		"    fields := struct {\n"
23599a2dd95SBruce Richardson 		"%s"
23699a2dd95SBruce Richardson 		"    };\n"
23799a2dd95SBruce Richardson 		"};\n\n", trace_id_get(tp->handle), tp->name,
23899a2dd95SBruce Richardson 		tp->ctf_field != NULL ? tp->ctf_field : "");
23999a2dd95SBruce Richardson 	return meta_copy(meta, offset, str, rc);
24099a2dd95SBruce Richardson }
24199a2dd95SBruce Richardson 
24299a2dd95SBruce Richardson int
trace_metadata_create(void)24399a2dd95SBruce Richardson trace_metadata_create(void)
24499a2dd95SBruce Richardson {
24599a2dd95SBruce Richardson 	struct trace_point_head *tp_list = trace_list_head_get();
24699a2dd95SBruce Richardson 	struct trace *trace = trace_obj_get();
24799a2dd95SBruce Richardson 	struct trace_point *tp;
24899a2dd95SBruce Richardson 	int rc, offset = 0;
24999a2dd95SBruce Richardson 	char *meta = NULL;
25099a2dd95SBruce Richardson 
25199a2dd95SBruce Richardson 	rc = meta_data_type_emit(&meta, &offset);
25299a2dd95SBruce Richardson 	if (rc < 0)
25399a2dd95SBruce Richardson 		goto fail;
25499a2dd95SBruce Richardson 
25599a2dd95SBruce Richardson 	rc = meta_header_emit(&meta, &offset);
25699a2dd95SBruce Richardson 	if (rc < 0)
25799a2dd95SBruce Richardson 		goto fail;
25899a2dd95SBruce Richardson 
25999a2dd95SBruce Richardson 	rc = meta_env_emit(&meta, &offset);
26099a2dd95SBruce Richardson 	if (rc < 0)
26199a2dd95SBruce Richardson 		goto fail;
26299a2dd95SBruce Richardson 
26399a2dd95SBruce Richardson 	rc = meta_clock_pass1_emit(&meta, &offset);
26499a2dd95SBruce Richardson 	if (rc < 0)
26599a2dd95SBruce Richardson 		goto fail;
26699a2dd95SBruce Richardson 	trace->ctf_meta_offset_freq = offset;
26799a2dd95SBruce Richardson 
26899a2dd95SBruce Richardson 	rc = meta_clock_pass2_emit(&meta, &offset);
26999a2dd95SBruce Richardson 	if (rc < 0)
27099a2dd95SBruce Richardson 		goto fail;
27199a2dd95SBruce Richardson 	trace->ctf_meta_offset_freq_off_s = offset;
27299a2dd95SBruce Richardson 
27399a2dd95SBruce Richardson 	rc = meta_clock_pass3_emit(&meta, &offset);
27499a2dd95SBruce Richardson 	if (rc < 0)
27599a2dd95SBruce Richardson 		goto fail;
27699a2dd95SBruce Richardson 	trace->ctf_meta_offset_freq_off = offset;
27799a2dd95SBruce Richardson 
27899a2dd95SBruce Richardson 	rc = meta_clock_pass4_emit(&meta, &offset);
27999a2dd95SBruce Richardson 	if (rc < 0)
28099a2dd95SBruce Richardson 		goto fail;
28199a2dd95SBruce Richardson 
28299a2dd95SBruce Richardson 	rc = meta_stream_emit(&meta, &offset);
28399a2dd95SBruce Richardson 	if (rc < 0)
28499a2dd95SBruce Richardson 		goto fail;
28599a2dd95SBruce Richardson 
28699a2dd95SBruce Richardson 	STAILQ_FOREACH(tp, tp_list, next)
28799a2dd95SBruce Richardson 		if (meta_event_emit(&meta, &offset, tp) < 0)
28899a2dd95SBruce Richardson 			goto fail;
28999a2dd95SBruce Richardson 
29099a2dd95SBruce Richardson 	trace->ctf_meta = meta;
29199a2dd95SBruce Richardson 	return 0;
29299a2dd95SBruce Richardson 
29399a2dd95SBruce Richardson fail:
29499a2dd95SBruce Richardson 	free(meta);
29599a2dd95SBruce Richardson 	return -EBADF;
29699a2dd95SBruce Richardson }
29799a2dd95SBruce Richardson 
29899a2dd95SBruce Richardson void
trace_metadata_destroy(void)29999a2dd95SBruce Richardson trace_metadata_destroy(void)
30099a2dd95SBruce Richardson {
30199a2dd95SBruce Richardson 	struct trace *trace = trace_obj_get();
30299a2dd95SBruce Richardson 
30399a2dd95SBruce Richardson 	if (trace->ctf_meta) {
30499a2dd95SBruce Richardson 		free(trace->ctf_meta);
30599a2dd95SBruce Richardson 		trace->ctf_meta = NULL;
30699a2dd95SBruce Richardson 	}
30799a2dd95SBruce Richardson }
30899a2dd95SBruce Richardson 
30999a2dd95SBruce Richardson static void
meta_fix_freq(struct trace * trace,char * meta)31099a2dd95SBruce Richardson meta_fix_freq(struct trace *trace, char *meta)
31199a2dd95SBruce Richardson {
31299a2dd95SBruce Richardson 	char *str;
31399a2dd95SBruce Richardson 	int rc;
31499a2dd95SBruce Richardson 
31599a2dd95SBruce Richardson 	str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq);
31699a2dd95SBruce Richardson 	rc = sprintf(str, "%20"PRIu64"", rte_get_timer_hz());
31799a2dd95SBruce Richardson 	str[rc] = ';';
31899a2dd95SBruce Richardson }
31999a2dd95SBruce Richardson 
32099a2dd95SBruce Richardson static void
meta_fix_freq_offset(struct trace * trace,char * meta)32199a2dd95SBruce Richardson meta_fix_freq_offset(struct trace *trace, char *meta)
32299a2dd95SBruce Richardson {
32399a2dd95SBruce Richardson 	uint64_t uptime_tickes_floor, uptime_ticks, freq, uptime_sec;
32499a2dd95SBruce Richardson 	uint64_t offset, offset_s;
32599a2dd95SBruce Richardson 	char *str;
32699a2dd95SBruce Richardson 	int rc;
32799a2dd95SBruce Richardson 
32899a2dd95SBruce Richardson 	uptime_ticks = trace->uptime_ticks &
32999a2dd95SBruce Richardson 			((1ULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT) - 1);
33099a2dd95SBruce Richardson 	freq = rte_get_tsc_hz();
33199a2dd95SBruce Richardson 	uptime_tickes_floor = RTE_ALIGN_MUL_FLOOR(uptime_ticks, freq);
33299a2dd95SBruce Richardson 
33399a2dd95SBruce Richardson 	uptime_sec = uptime_tickes_floor / freq;
33499a2dd95SBruce Richardson 	offset_s = trace->epoch_sec - uptime_sec;
33599a2dd95SBruce Richardson 
33699a2dd95SBruce Richardson 	offset = uptime_ticks - uptime_tickes_floor;
33799a2dd95SBruce Richardson 	offset += trace->epoch_nsec * (freq / NSEC_PER_SEC);
33899a2dd95SBruce Richardson 
33999a2dd95SBruce Richardson 	str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off_s);
34099a2dd95SBruce Richardson 	rc = sprintf(str, "%20"PRIu64"", offset_s);
34199a2dd95SBruce Richardson 	str[rc] = ';';
34299a2dd95SBruce Richardson 	str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off);
34399a2dd95SBruce Richardson 	rc = sprintf(str, "%20"PRIu64"", offset);
34499a2dd95SBruce Richardson 	str[rc] = ';';
34599a2dd95SBruce Richardson }
34699a2dd95SBruce Richardson 
34799a2dd95SBruce Richardson static void
meta_fixup(struct trace * trace,char * meta)34899a2dd95SBruce Richardson meta_fixup(struct trace *trace, char *meta)
34999a2dd95SBruce Richardson {
35099a2dd95SBruce Richardson 	meta_fix_freq(trace, meta);
35199a2dd95SBruce Richardson 	meta_fix_freq_offset(trace, meta);
35299a2dd95SBruce Richardson }
35399a2dd95SBruce Richardson 
35499a2dd95SBruce Richardson int
rte_trace_metadata_dump(FILE * f)35599a2dd95SBruce Richardson rte_trace_metadata_dump(FILE *f)
35699a2dd95SBruce Richardson {
35799a2dd95SBruce Richardson 	struct trace *trace = trace_obj_get();
35899a2dd95SBruce Richardson 	char *ctf_meta = trace->ctf_meta;
35999a2dd95SBruce Richardson 	int rc;
36099a2dd95SBruce Richardson 
36199a2dd95SBruce Richardson 	if (ctf_meta == NULL)
36299a2dd95SBruce Richardson 		return -EINVAL;
36399a2dd95SBruce Richardson 
364*2a7a42a5STyler Retzlaff 	if (!rte_atomic_load_explicit(&trace->ctf_fixup_done, rte_memory_order_seq_cst) &&
36599a2dd95SBruce Richardson 				rte_get_timer_hz()) {
36699a2dd95SBruce Richardson 		meta_fixup(trace, ctf_meta);
367*2a7a42a5STyler Retzlaff 		rte_atomic_store_explicit(&trace->ctf_fixup_done, 1, rte_memory_order_seq_cst);
36899a2dd95SBruce Richardson 	}
36999a2dd95SBruce Richardson 
37099a2dd95SBruce Richardson 	rc = fprintf(f, "%s", ctf_meta);
37199a2dd95SBruce Richardson 	return rc < 0 ? rc : 0;
37299a2dd95SBruce Richardson }
37399a2dd95SBruce Richardson 
trace_metadata_fixup_field(const char * field)37499a2dd95SBruce Richardson char *trace_metadata_fixup_field(const char *field)
37599a2dd95SBruce Richardson {
37699a2dd95SBruce Richardson 	const char *ctf_reserved_words[] = {
37799a2dd95SBruce Richardson 		"align",
37899a2dd95SBruce Richardson 		"event",
37999a2dd95SBruce Richardson 	};
38099a2dd95SBruce Richardson 	unsigned int i;
38199a2dd95SBruce Richardson 	char *out;
38299a2dd95SBruce Richardson 	char *p;
38399a2dd95SBruce Richardson 
38499a2dd95SBruce Richardson 	/* reserved keywords */
38599a2dd95SBruce Richardson 	for (i = 0; i < RTE_DIM(ctf_reserved_words); i++) {
38699a2dd95SBruce Richardson 		if (strcmp(field, ctf_reserved_words[i]) != 0)
38799a2dd95SBruce Richardson 			continue;
38899a2dd95SBruce Richardson 		if (asprintf(&out, "_%s", ctf_reserved_words[i]) == -1)
38999a2dd95SBruce Richardson 			out = NULL;
39099a2dd95SBruce Richardson 		return out;
39199a2dd95SBruce Richardson 	}
39299a2dd95SBruce Richardson 
39399a2dd95SBruce Richardson 	/* nothing to replace, return early */
39499a2dd95SBruce Richardson 	if (strstr(field, ".") == NULL && strstr(field, "->") == NULL)
39599a2dd95SBruce Richardson 		return NULL;
39699a2dd95SBruce Richardson 
39799a2dd95SBruce Richardson 	out = strdup(field);
39899a2dd95SBruce Richardson 	if (out == NULL)
39999a2dd95SBruce Richardson 		return NULL;
40099a2dd95SBruce Richardson 	p = out;
40199a2dd95SBruce Richardson 	while ((p = strstr(p, ".")) != NULL) {
40299a2dd95SBruce Richardson 		p[0] = '_';
40399a2dd95SBruce Richardson 		p++;
40499a2dd95SBruce Richardson 	}
40599a2dd95SBruce Richardson 	p = out;
40699a2dd95SBruce Richardson 	while ((p = strstr(p, "->")) != NULL) {
40799a2dd95SBruce Richardson 		p[0] = '_';
40899a2dd95SBruce Richardson 		p++;
40999a2dd95SBruce Richardson 		memmove(p, p + 1, strlen(p));
41099a2dd95SBruce Richardson 	}
41199a2dd95SBruce Richardson 	return out;
41299a2dd95SBruce Richardson }
413