trace: add trace directory configuration parameter
[dpdk.git] / lib / librte_eal / common / eal_trace.h
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_CTF_FIELD_SIZE 384
28 #define TRACE_POINT_NAME_SIZE 64
29 #define TRACE_CTF_MAGIC 0xC1FC1FC1
30 #define TRACE_MAX_ARGS  32
31
32 struct trace_point {
33         STAILQ_ENTRY(trace_point) next;
34         rte_trace_point_t *handle;
35         char name[TRACE_POINT_NAME_SIZE];
36         char ctf_field[TRACE_CTF_FIELD_SIZE];
37 };
38
39 enum trace_area_e {
40         TRACE_AREA_HEAP,
41         TRACE_AREA_HUGEPAGE,
42 };
43
44 struct thread_mem_meta {
45         void *mem;
46         enum trace_area_e area;
47 };
48
49 struct trace_args {
50         uint8_t nb_args;
51         char *args[TRACE_MAX_ARGS];
52 };
53
54 struct trace {
55         char dir[PATH_MAX];
56         int dir_offset;
57         int register_errno;
58         bool status;
59         enum rte_trace_mode mode;
60         rte_uuid_t uuid;
61         uint32_t buff_len;
62         struct trace_args args;
63         uint32_t nb_trace_points;
64         uint32_t nb_trace_mem_list;
65         struct thread_mem_meta *lcore_meta;
66         uint64_t epoch_sec;
67         uint64_t epoch_nsec;
68         uint64_t uptime_ticks;
69         char *ctf_meta;
70         uint32_t ctf_meta_offset_freq;
71         uint32_t ctf_meta_offset_freq_off_s;
72         uint32_t ctf_meta_offset_freq_off;
73         uint16_t ctf_fixup_done;
74         rte_spinlock_t lock;
75 };
76
77 /* Helper functions */
78 static inline uint16_t
79 trace_id_get(rte_trace_point_t *trace)
80 {
81         return (*trace & __RTE_TRACE_FIELD_ID_MASK) >>
82                 __RTE_TRACE_FIELD_ID_SHIFT;
83 }
84
85 static inline size_t
86 trace_mem_sz(uint32_t len)
87 {
88         return len + sizeof(struct __rte_trace_header);
89 }
90
91 /* Trace object functions */
92 struct trace *trace_obj_get(void);
93
94 /* Trace point list functions */
95 STAILQ_HEAD(trace_point_head, trace_point);
96 struct trace_point_head *trace_list_head_get(void);
97
98 /* Util functions */
99 const char *trace_mode_to_string(enum rte_trace_mode mode);
100 const char *trace_area_to_string(enum trace_area_e area);
101 int trace_args_apply(const char *arg);
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 int trace_mkdir(void);
107 int trace_epoch_time_save(void);
108 void trace_mem_per_thread_free(void);
109
110 /* EAL interface */
111 int eal_trace_init(void);
112 void eal_trace_fini(void);
113 int eal_trace_args_save(const char *optarg);
114 void eal_trace_args_free(void);
115 int eal_trace_dir_args_save(const char *optarg);
116
117 #endif /* __EAL_TRACE_H */