xref: /f-stack/dpdk/lib/librte_eal/common/eal_trace.h (revision 2d9fd380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2020 Marvell International Ltd.
3  */
4 
5 #ifndef __EAL_TRACE_H
6 #define __EAL_TRACE_H
7 
8 #include <rte_cycles.h>
9 #include <rte_log.h>
10 #include <rte_malloc.h>
11 #include <rte_spinlock.h>
12 #include <rte_trace.h>
13 #include <rte_trace_point.h>
14 #include <rte_uuid.h>
15 
16 #include "eal_private.h"
17 #include "eal_thread.h"
18 
19 #define trace_err(fmt, args...) \
20 	RTE_LOG(ERR, EAL, "%s():%u " fmt "\n", __func__, __LINE__, ## args)
21 
22 #define trace_crit(fmt, args...) \
23 	RTE_LOG(CRIT, EAL, "%s():%u " fmt "\n", __func__, __LINE__, ## args)
24 
25 #define TRACE_PREFIX_LEN 12
26 #define TRACE_DIR_STR_LEN (sizeof("YYYY-mm-dd-AM-HH-MM-SS") + TRACE_PREFIX_LEN)
27 #define TRACE_POINT_NAME_SIZE 64
28 #define TRACE_CTF_MAGIC 0xC1FC1FC1
29 #define TRACE_MAX_ARGS	32
30 
31 struct trace_point {
32 	STAILQ_ENTRY(trace_point) next;
33 	rte_trace_point_t *handle;
34 	char name[TRACE_POINT_NAME_SIZE];
35 	char *ctf_field;
36 };
37 
38 enum trace_area_e {
39 	TRACE_AREA_HEAP,
40 	TRACE_AREA_HUGEPAGE,
41 };
42 
43 struct thread_mem_meta {
44 	void *mem;
45 	enum trace_area_e area;
46 };
47 
48 struct trace_arg {
49 	STAILQ_ENTRY(trace_arg) next;
50 	char *val;
51 };
52 
53 struct trace {
54 	char dir[PATH_MAX];
55 	int dir_offset;
56 	int register_errno;
57 	bool status;
58 	enum rte_trace_mode mode;
59 	rte_uuid_t uuid;
60 	uint32_t buff_len;
61 	STAILQ_HEAD(, trace_arg) args;
62 	uint32_t nb_trace_points;
63 	uint32_t nb_trace_mem_list;
64 	struct thread_mem_meta *lcore_meta;
65 	uint64_t epoch_sec;
66 	uint64_t epoch_nsec;
67 	uint64_t uptime_ticks;
68 	char *ctf_meta;
69 	uint32_t ctf_meta_offset_freq;
70 	uint32_t ctf_meta_offset_freq_off_s;
71 	uint32_t ctf_meta_offset_freq_off;
72 	uint16_t ctf_fixup_done;
73 	rte_spinlock_t lock;
74 };
75 
76 /* Helper functions */
77 static inline uint16_t
trace_id_get(rte_trace_point_t * trace)78 trace_id_get(rte_trace_point_t *trace)
79 {
80 	return (*trace & __RTE_TRACE_FIELD_ID_MASK) >>
81 		__RTE_TRACE_FIELD_ID_SHIFT;
82 }
83 
84 static inline size_t
trace_mem_sz(uint32_t len)85 trace_mem_sz(uint32_t len)
86 {
87 	return len + sizeof(struct __rte_trace_header);
88 }
89 
90 /* Trace object functions */
91 struct trace *trace_obj_get(void);
92 
93 /* Trace point list functions */
94 STAILQ_HEAD(trace_point_head, trace_point);
95 struct trace_point_head *trace_list_head_get(void);
96 
97 /* Util functions */
98 const char *trace_mode_to_string(enum rte_trace_mode mode);
99 const char *trace_area_to_string(enum trace_area_e area);
100 int trace_args_apply(const char *arg);
101 void trace_bufsz_args_apply(void);
102 bool trace_has_duplicate_entry(void);
103 void trace_uuid_generate(void);
104 int trace_metadata_create(void);
105 void trace_metadata_destroy(void);
106 char *trace_metadata_fixup_field(const char *field);
107 int trace_mkdir(void);
108 int trace_epoch_time_save(void);
109 void trace_mem_free(void);
110 void trace_mem_per_thread_free(void);
111 
112 /* EAL interface */
113 int eal_trace_init(void);
114 void eal_trace_fini(void);
115 int eal_trace_args_save(const char *val);
116 void eal_trace_args_free(void);
117 int eal_trace_dir_args_save(const char *val);
118 int eal_trace_mode_args_save(const char *val);
119 int eal_trace_bufsz_args_save(const char *val);
120 
121 #endif /* __EAL_TRACE_H */
122